2012-06-05 13 views
2

檢查時我有以下NUnit測試失敗:NUnit的Has.Member爲對象

PL.Web.MVC.Rules.Tests.ComplexRulesServiceTests.GetComplexRulesTestContents: 
Expected: collection containing <PL.Web.MVC.Models.Rules.RuleViewModel> 
But was: < <PL.Web.MVC.Models.Rules.RuleViewModel>, PL.Web.MVC.Models.Rules.RuleViewModel>, <PL.Web.MVC.Models.Rules.RuleViewModel> > 

我從http://www.nunit.org/index.php?p=collectionConstraints&r=2.5.5嘗試了測試,他們全部通過。

這是什麼我做錯了?

感謝您的幫助提前!

回答

6

Has.Member使用對象的平等來驗證集合是否包含項目:

對於引用,Has.Member使用對象平等找到集合中的一個成員。

這意味着什麼,你的類將使用默認的平等比較進行比較,其中(除非你重寫它)是對象引用相等。而這些都是4個不同的例子。

你可以用LINQ的位進行簡單的謂詞匹配來解決問題:

var expectedItem = results.FirstOrDefault(vm => vm.Property1 == null 
    && vm.Name == "third rule" && vm.Description == "description"); 
Assert.That(expectedItem, Is.Not.Null); 

或者,使其更整齊,你可以添加自定義相等比較的方法來你的測試類,並與謂詞匹配使用多一點流利:

private bool RulesMatch(RuleViewModel actual, RuleViewModel expected) 
{ 
    return actual.Property1 == expected.Property1 
     && actual.Name == expected.Name 
     && actual.Description == expected.Description; 
} 

Assert.That(results, Has.Some.Matches<RuleViewModel>(v => RulesMatch(v, _rule))); 
+0

謝謝jimmy_keen。爲了讓它在此期間工作,我重寫了自定義類中的默認相等比較,並檢查了使用Assert的array.Contains(var)。感謝您的澄清,我很好奇它是否在幕後做了一些「特殊」的事情。 – JGraves

相關問題