2011-01-23 50 views
1

当我为一个简单的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方法接收到一个对象?这个测试是否增加了价值?这是值得的时间来写它?

如果我在此场景中添加曲线,即我的控制器上的SaveObject方法重定向到另一个操作,我将如何测试重定向?

回答

2

没有。

在这种情况下,您正在测试您是否正确编写了测试。

如果您使用任何类型的RDBMS,通常使用内存中的存储库进行测试通常是不好的,因为除非您复制所有数据和关系约束,否则很容易针对在生产中不会发生的情况编写测试。

现在这是有争议的,但这种类型的测试几乎是无用的,因为它可能你的应用程序甚至不运行没有这个逻辑工作。如果这段逻辑失败,所有的集成测试也将失败。这对我来说足够了。

+0

你对关于使用内存版本的RDBMS的评论确实引起了共鸣。我已经被这几次烧了 - 最令人惊讶的是,如果你说r.Name == nameVar其中nameVar为null,你会得到一个无用的T-SQL WHERE Name的查询,那么LINQ/EF不会在查询中正确处理null = @whatever与@whatever为空,而不是IS NULL查询。测试运行良好,但不在现实世界中 – 2011-01-23 17:52:08

1

它看起来像这个测试测试的唯一事情是你的模拟框架设置正确。我会说在这样的测试中价值很小。为了试着回答你的第二个问题,如果你的SaveObject方法重定向到另一个动作,比如说X,我想你会想测试一下其他一些模拟上的一些公共动作是由X执行的。很难做到更多具体没有更多的细节。

1

如果你想测试你的仓库,你不应该嘲笑它。相反,嘲笑它的依赖关系。

用于测试重定向尝试mvccontrib测试助手。有了它你可以做这样的事情:

 [Test] 
     public void RedirectToIndex() 
     { 
      SomeController controller = new SomeController(); 
      ActionResult result = controller.Index(); 
      result.AssertActionRedirect().ToAction("Index"); 
     }