这个测试真的能增加价值......?

时间:2011-01-23 17:41:03

标签: tdd mstest

当我为一个简单的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方法重定向到另一个动作,我该如何测试重定向?

3 个答案:

答案 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");
        }