当我为一个简单的asp.net mvc 3应用程序编写测试时,我注意到一些关于我过去盲目写过的测试。
[TestMethod]
public void Add_Saves_Object()
{
var rep = new Mock<IRepository>();
rep.Setup(x => x.Save<Object>(It.IsAny<Object>())).Returns(new Object() {Id = 1});
var pick = rep.Object.Save<Pick>(new Object());
Assert.IsNotNull(pick);
Assert.AreEqual(1, pick.Id);
}
这里的假设是我已经针对“内存中”数据存储测试了我的IRepository实现,并且Save方法正确地返回了一个对象(因为我正在模拟我的存储库)。由于我的存储库测试成功通过,我是否需要测试我的控制器是否正确调用存储库并从save方法接收一个对象?这个测试是否增加了价值?是否值得花时间写它?
如果我在这个场景中添加一条曲线,即我控制器上的SaveObject方法重定向到另一个动作,我该如何测试重定向?
答案 0 :(得分:2)
不。
在这种情况下,您正在测试您是否正确编写了测试。
如果您使用任何类型的RDBMS,通常使用内存存储库进行测试通常会很糟糕,因为除非您复制所有数据和关系约束,否则很容易针对生产中永远不会发生的情况编写测试。 / p>
现在这是有争议的,但这种类型的测试几乎没用,因为如果没有这个逻辑工作,你的应用程序可能就不会运行了。如果这条逻辑失败,所有集成测试也将失败。这对我来说已经足够了。
答案 1 :(得分:1)
看起来这个测试唯一测试的是你的模拟框架设置正确。我想说这种测试的价值很小。
为了尝试回答你的第二个问题,如果你的SaveObject方法重定向到另一个动作,比如X,我认为你会想要测试一些其他模拟的公共动作是由X执行的。很难更具体没有更多细节。
答案 2 :(得分:1)
如果要测试存储库,则不应该模拟它。相反,模仿它的依赖。
用于测试重定向试用mvccontrib Test Helper。有了它你可以做这样的事情:
[Test]
public void RedirectToIndex()
{
SomeController controller = new SomeController();
ActionResult result = controller.Index();
result.AssertActionRedirect().ToAction("Index");
}