单元测试在调试时通过,但在运行时失败

时间:2011-06-19 09:59:16

标签: c# unit-testing debugging testing

搜索方法返回任何匹配的文章和最新的非匹配文章,直到指定的数字。

在返回之前,匹配文章的IsMatch属性设置为true,如下所示:

articles = matchingArticles.Select(c => {c.IsMatch = true; return c;})。ToList();

在这种方法的测试中,

    [Test]
    public void SearchForArticle1Returns1MatchingArticleFirstInTheList()
    {
        using (var session = _sessionFactory.OpenSession())
        {
            var maxResults = 10;
            var searchPhrase = "Article1";
            IArticleRepository articleRepository = new ArticleRepository(session);
            var articles = articleRepository.GetSearchResultSet(searchPhrase, maxResults);
            Assert.AreEqual(10, articles.Count);
            Assert.AreEqual(1, articles.Where(a => a.Title.Contains(searchPhrase)).Count());
            var article = articles[0];
            Assert.IsTrue(article.Title.Contains(searchPhrase));
            Assert.IsTrue(article.IsMatch);
        }
    }

当在调试中运行测试时,所有断言都会通过,但是在发布中运行测试时,最终断言会失败:

预期:是的   但是:错误

在应用程序本身中,响应是正确的。

有关为何发生这种情况的任何想法?

编辑:

我弄清楚问题是什么。这基本上是一种竞争条件。当我设置测试时,我正在删除db表,重新创建它并用测试数据填充它。由于搜索依赖于全文搜索,因此我在相关列上创建文本索引并将其设置为自动填充。当在调试中运行时,似乎有足够的时间来填充文本索引,并且搜索查询返回匹配项。当我运行测试时,我不认为索引已经及时填充,没有返回匹配并且测试失败。它与日期时间问题类似。如果我在创建目录和运行测试之间设置了延迟,那么测试就会通过。

2 个答案:

答案 0 :(得分:7)

Pones,你已经澄清了单元测试在没有调试时失败。

在这个阶段它可能是任何东西但是你应该继续运行单元测试而不是调试并在你知道的地方插入以下语句(或者你认为你知道)是真的

 if(condition)
            Debugger.Launch();

这将显而易见,并允许你区分什么是错误的。我建议的地方是IsMatch属性(对于初学者)

你可以遇到这样的问题的另一个常见的地方是使用DateTime。如果您的单元测试运行“太快”,那么它可能会打破您的假设。

答案 1 :(得分:0)

尝试print out将它们与debugnormal run上的预期结果进行比较的实际结果

就我而言,I created entities(JBA)in the test method

debug模式下,generated ids是1、2和3

但是在normal running模式下,他们知道different

这导致我的hard-coded值使测试失败,因此我将其更改为从实体获取ID,而不是采用硬编码方式

希望这会有所帮助