我正在尝试为MVC缓存创建单元测试。目前,我创建了一个新的MockRepository(CacheManager是包装类),我试图找出Get函数返回null的原因。我的经理提到他认为这与创建模拟HTTP上下文有关。
// 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);
答案 0 :(得分:0)
- 我是否需要使用模拟HTTP上下文来使用Rhino进行单元测试?
醇>
你可能需要像HttpRequestMessage那样模拟类,但我认为你还没有达到这一点。
- 我的当前代码是否正确,假设Get和Set实际上按预期工作?
醇>
目前还不完全清楚你想要达到的目标(测试)。如果你想测试实际的缓存,那将是一个系统测试(添加到缓存中,然后从实际缓存中读取)。但是,您通常只想从依赖项中获取一些输入,以便能够到达您的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”)。
- 任何人都可以向我解释一下缓存在这个MVC环境中是如何工作的,所以我可以更好地理解编码吗?
醇>
似乎没有关于该缓存的特定MVC上下文 - 它可能只是一个缓解应用程序负载的情况,不希望为每个请求命中数据库,特别是对于可能不会更改该数据的数据经常。您可以将此数据存储在内存/某些第三方缓存提供程序中,这将比您的数据库返回更快。然后,当数据发生更改时,您将使此缓存无效。