单元使用Rhino Mocks测试MVC Cache,我是否需要使用HttpContext?

时间:2016-06-23 16:21:17

标签: unit-testing model-view-controller mocking rhino-mocks

我正在尝试为MVC缓存创建单元测试。目前,我创建了一个新的MockRepository(CacheManager是包装类),我试图找出Get函数返回null的原因。我的经理提到他认为这与创建模拟HTTP上下文有关。

  1. 我是否需要使用模拟HTTP上下文来使用Rhino进行单元测试?
  2. 我的当前代码是否正确,假设Get和Set实际上按预期工作?
  3. 任何人都可以向我解释一下缓存在这个MVC环境中是如何工作的,所以我可以更好地理解编码吗?
  4.        // ARRANGE
            MockRepository mocks = new MockRepository();
            CacheManager cache = mocks.Stub<CacheManager>();
            cache.initialize();
    
            String str = "world";
    
            // ACT
            cache.Add<String>("hello", str);
            String hi = cache.Get<String>("hello");
    
            // ASSERT
            Assert.AreEqual(str, hi);
    

1 个答案:

答案 0 :(得分:0)

  
      
  1. 我是否需要使用模拟HTTP上下文来使用Rhino进行单元测试?
  2.   

你可能需要像HttpRequestMessage那样模拟类,但我认为你还没有达到这一点。

  
      
  1. 我的当前代码是否正确,假设Get和Set实际上按预期工作?
  2.   

目前还不完全清楚你想要达到的目标(测试)。如果你想测试实际的缓存,那将是一个系统测试(添加到缓存中,然后从实际缓存中读取)。但是,您通常只想从依赖项中获取一些输入,以便能够到达您的sut(受测系统)中的某些代码路径 - 您正在测试的类。

这是您可以设置缓存模拟以返回特定方法调用的内容的方法:

CacheManager cache = MockRepository.GenerateMock<CacheManager>();
cache
    .Stub(x => x.Get(Arg<String>.is.Anything))
    .Return("hello");

你可以用类似的东西来跟进

cache.AssertWasCalled(x => x.Get<Arg<String>.Matches("abc"));

或沿着这些行的东西(或者你可以使用“Expect”而不是“Stub”)。

  
      
  1. 任何人都可以向我解释一下缓存在这个MVC环境中是如何工作的,所以我可以更好地理解编码吗?
  2.   

似乎没有关于该缓存的特定MVC上下文 - 它可能只是一个缓解应用程序负载的情况,不希望为每个请求命中数据库,特别是对于可能不会更改该数据的数据经常。您可以将此数据存储在内存/某些第三方缓存提供程序中,这将比您的数据库返回更快。然后,当数据发生更改时,您将使此缓存无效。

相关问题