C# 如何模拟Azure Redis缓存?
如何模拟Azure Redis缓存C# 如何模拟Azure Redis缓存?,c#,rhino-mocks,justmock,C#,Rhino Mocks,Justmock,如何模拟Azure Redis缓存 我想为我的一个使用Azure Redis缓存的应用程序编写单元测试。由于我对编写单元测试代码中的模拟和存根完全不熟悉,因此我正在寻求帮助,了解如何开始模拟/存根缓存组件的基本脚本。使用外部资源(如数据库、文件和缓存)进行测试是集成测试,而不是单元测试。您可以在单元测试中测试的事实是,您的代码正在调用缓存方法 因此,首先,您需要缓存服务的接口。该接口不仅允许您测试代码,还允许您使用不同的缓存服务器 public interface ICache { vo
我想为我的一个使用Azure Redis缓存的应用程序编写单元测试。由于我对编写单元测试代码中的模拟和存根完全不熟悉,因此我正在寻求帮助,了解如何开始模拟/存根缓存组件的基本脚本。使用外部资源(如数据库、文件和缓存)进行测试是集成测试,而不是单元测试。您可以在单元测试中测试的事实是,您的代码正在调用缓存方法 因此,首先,您需要缓存服务的接口。该接口不仅允许您测试代码,还允许您使用不同的缓存服务器
public interface ICache
{
void Add<T>(string key, TimeSpan lifetime, T value);
bool TryGet<T>(string key, out T value);
void Remove(string key);
. . .
}
第三,让我们制作存根缓存:
public class StubCache : ICache
{
public bool TryGetResult { get; set; }
public bool TryGetValue { get; set; }
public bool AddValue { get; set; }
public TimeStamp LifeTimeValue { get; set; }
void Add<T>(string key, TimeSpan lifetime, T value)
{
LifeTimeValue = lifetime;
AddValue = (bool)(object)value;
}
bool TryGet<T>(string key, out T value)
{
value = (T)(object)TryGetValue;
return TryGetResult;
}
. . .
}
为了简化实现存根和模拟,您可以使用如下库。这些库允许您自动生成存根和模拟。因此,您的测试代码将如下所示:
pubic void ConfirmImNotSleeping_WhenCalled_CallsAdd()
{
var cacheStub = new Mock<ICache>();
var notifierStub = new Mock<INotifier>();
var service = new SleepingMembersService(cache.Object, notifier.Object);
var userStub = new Mock<IUser>();
service.ConfirmNotSleeping(user.Object);
cacheStub.Vertify(x => x.Add(It.IsAny<string>(), It.IsAny<TimeStamp>(), true));
}
pubic void confirminnotsleeping\u when CallsAdd()
{
var cacheStub=new Mock();
var notifierStub=new Mock();
var service=newsleepingmembersService(cache.Object,notifier.Object);
var userStub=new Mock();
service.ConfirmNotSleeping(user.Object);
Vertify(x=>x.Add(It.IsAny(),It.IsAny(),true));
}
使用数据库、文件和缓存等外部资源进行测试是集成测试,非单元测试。您可以在单元测试中测试的事实是,您的代码正在调用缓存方法
因此,首先,您需要缓存服务的接口。该接口不仅允许您测试代码,还允许您使用不同的缓存服务器
public interface ICache
{
void Add<T>(string key, TimeSpan lifetime, T value);
bool TryGet<T>(string key, out T value);
void Remove(string key);
. . .
}
第三,让我们制作存根缓存:
public class StubCache : ICache
{
public bool TryGetResult { get; set; }
public bool TryGetValue { get; set; }
public bool AddValue { get; set; }
public TimeStamp LifeTimeValue { get; set; }
void Add<T>(string key, TimeSpan lifetime, T value)
{
LifeTimeValue = lifetime;
AddValue = (bool)(object)value;
}
bool TryGet<T>(string key, out T value)
{
value = (T)(object)TryGetValue;
return TryGetResult;
}
. . .
}
为了简化实现存根和模拟,您可以使用如下库。这些库允许您自动生成存根和模拟。因此,您的测试代码将如下所示:
pubic void ConfirmImNotSleeping_WhenCalled_CallsAdd()
{
var cacheStub = new Mock<ICache>();
var notifierStub = new Mock<INotifier>();
var service = new SleepingMembersService(cache.Object, notifier.Object);
var userStub = new Mock<IUser>();
service.ConfirmNotSleeping(user.Object);
cacheStub.Vertify(x => x.Add(It.IsAny<string>(), It.IsAny<TimeStamp>(), true));
}
pubic void confirminnotsleeping\u when CallsAdd()
{
var cacheStub=new Mock();
var notifierStub=new Mock();
var service=newsleepingmembersService(cache.Object,notifier.Object);
var userStub=new Mock();
service.ConfirmNotSleeping(user.Object);
Vertify(x=>x.Add(It.IsAny(),It.IsAny(),true));
}
谢谢您的帮助!但是,第三步是在-void Add(字符串键,TimeSpan life,T value){LifeTimeValue=life;AddValue=value;}中给出编译错误,因为值的类型是T。如果您能给出一个简单的set示例,并从Redis缓存中获取一个对象以及随后的测试代码,那就太好了。谢谢我纠正了方法Add
和TryGet
实现中的错误。关于你的第二条评论:我的回答描述了缓存逻辑的单元测试。如果您想在测试中调用Redis方法,将有集成测试,而不是单元测试。谢谢您的建议/回复。谢谢您的帮助!但是,第三步是在-void Add(字符串键,TimeSpan life,T value){LifeTimeValue=life;AddValue=value;}中给出编译错误,因为值的类型是T。如果您能给出一个简单的set示例,并从Redis缓存中获取一个对象以及随后的测试代码,那就太好了。谢谢我纠正了方法Add
和TryGet
实现中的错误。关于你的第二条评论:我的回答描述了缓存逻辑的单元测试。如果您想在测试中调用Redis方法,将有集成测试,而不是单元测试。谢谢您的建议/回复。