asp.net-mvc - 如何模拟 ServiceStackController Cache 属性?

标签 asp.net-mvc unit-testing caching mocking servicestack

给出以下 ServiceStack Controller

public class MyController : ServiceStackController 
{
    public ActionResult Index()
    {
        return View(Cache.GetAllKeys());
    }
}

和以下测试类
[TestFixture]
public class MyControllerTests 
{
    [Test]
    public void Should_call_cache()
    {
        var controller = new MyController();
        // Mock here to access Cache, otherwise throws NullReferenceException
        var result = controller.Index();
        Assert.IsNotNull(result);
        var model = result.Model as IEnumerable<string>;
        Assert.IsNotNull(model);
    }
}

什么是模拟的正确方法ICacheClient缓存属性能够验证测试方法?

最佳答案

更新:

正如 OP 在评论中所述。 mock 被测对象的做法通常是避免的。然而,由于底层类的糟糕设计 (IMO) 在内部与实现问题紧密耦合,使得难以单独测试,那么解决方法是使用一些允许在执行测试时进行更多控制的东西来覆盖问题成员.
Cache一个只读的虚拟属性,但它可以在派生类中被覆盖。使用它作为模拟所需功能的入口点。

创建被测类的派生类并覆盖 Cache属性返回一个行为符合预期的模拟。

在以下示例中,Moq 用于模拟主题 Controller 并覆盖 Cache虚拟属性(property)。

public void _Should_call_cache() {
    //Arrange
    var controller = Mock.Of<MyController>();

    var keys = new[] { "key1", "key2", "key3" };
    var cacheMock = new Mock<ICacheClient>();
    cacheMock.Setup(_ => _.GetAllKeys()).Returns(keys);

    var mockController = Mock.Get(controller);
    mockController.CallBase = true;
    mockController.Setup(_ => _.Cache).Returns(cacheMock.Object);

    //Act
    var result = controller.Index() as ViewResult;

    //Assert
    Assert.IsNotNull(result);
    var model = result.Model as IEnumerable<string>;
    Assert.IsNotNull(model);
}

我查看了 ServiceStackController.cs意识到可以覆盖 readonly 属性。

关于asp.net-mvc - 如何模拟 ServiceStackController Cache 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44545338/

相关文章:

asp.net-mvc - 使用 RowAction 更改 Kendo MVC 网格中的行颜色

c# - 如何在 MVC 中处理耗时的服务器端初始化?

unit-testing - 从父组件传递到子组件的 Angular 2 单元测试数据

ios - 我应该在哪里放置单元测试?

javascript - Angular 新变化未反射(reflect)出来

c# - NHibernate 哪个缓存用于 WinForms 应用程序

c# - 从 Xml 文件读取最有效和缓存的方式

asp.net-mvc - 我们可以像部署WebForm网站项目一样通过复制源代码(不编译)来部署asp.net MVC应用程序吗?

asp.net-mvc - 多语言网站中本地化解析器的自动映射器映射

android - Espresso 自定义 ViewMatcher 不匹配描述未出现在日志中