C# 如何模拟Azure Redis缓存?

C# 如何模拟Azure Redis缓存?,c#,rhino-mocks,justmock,C#,Rhino Mocks,Justmock,如何模拟Azure Redis缓存 我想为我的一个使用Azure Redis缓存的应用程序编写单元测试。由于我对编写单元测试代码中的模拟和存根完全不熟悉,因此我正在寻求帮助,了解如何开始模拟/存根缓存组件的基本脚本。使用外部资源(如数据库、文件和缓存)进行测试是集成测试,而不是单元测试。您可以在单元测试中测试的事实是,您的代码正在调用缓存方法 因此,首先,您需要缓存服务的接口。该接口不仅允许您测试代码,还允许您使用不同的缓存服务器 public interface ICache { vo

如何模拟Azure Redis缓存


我想为我的一个使用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方法,将有集成测试,而不是单元测试。谢谢您的建议/回复。