【发布时间】:2011-06-19 09:59:15
【问题描述】:
搜索方法返回任何匹配的文章和最新的不匹配文章,最多指定数量。
在返回之前,匹配文章的 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);
}
}
在 debug 中运行测试时所有断言都通过,但在 release 中运行测试时最终断言失败:
预期:真 但是是:错误
在应用程序本身中,响应是正确的。
关于为什么会发生这种情况的任何想法?
编辑:
我发现了问题所在。这本质上是一种竞争条件。当我设置测试时,我删除了 db 表,重新创建它并用测试数据填充它。由于搜索依赖于全文搜索,我正在相关列上创建一个文本索引并将其设置为自动填充。当它在调试中运行时,似乎有足够的时间来填充文本索引并且搜索查询返回匹配项。当我运行测试时,我认为索引没有及时填充,没有返回匹配项并且测试失败。它类似于日期时间的问题。如果我在创建目录和运行测试之间设置延迟,则测试通过。
【问题讨论】:
-
我对count==10和count==1的检查有点糊涂,然后你随便挑文章[0]。文章顺序有多少控制权?
-
就像@Henk Holterman 所说,您可能应该过滤到包含 searchPhrase 的位置,然后获取第一个
-
@Henk Holterman, @Oskar Kjellin 感谢收看。匹配的文章在列表中的第一位,它在存储库方法中得到处理并在其他地方进行了测试。但是,如果我按照您的建议进行操作:
//var article = articles[0]; var article = articles.Where(a => a.Title.Contains(searchPhrase)).ToList()[0]; Assert.IsTrue(article.Title.Contains(searchPhrase)); Assert.IsTrue(article.IsMatch);结果是一样的。 -
@Pones 当你说
when the test is run in release- 你的意思是这样还是不是在调试测试时? -
@Oskar Kjellin,最后的断言:Assert.IsTrue(article.IsMatch); @wal,我的意思是当不调试测试时 - 只是使用 re#er 运行。
标签: c# unit-testing debugging testing