2

次の NUnit テストがあります。

[Test]
    public void GetComplexRulesTestContents()
    {
        var _rule = new RuleViewModel(null, "third rule", "description");
        var result = _complexRulesService.GetComplexRules();

        Assert.That(result, Has.Member(_rule));

    }

_complexRulesService.GetComplexRules() から呼び出されるコードは次のとおりです。

public IEnumerable<IRuleViewModel> GetComplexRules()
    {

        IEnumerable<RuleViewModel> _rules;
        _rules = new List<RuleViewModel>
                     {
                         new RuleViewModel(null, "first default rule", "description"),
                         new RuleViewModel(null, "second default rule", "description"),
                         new RuleViewModel(null, "third rule", "description")
                     };
        return _rules;
    }

私が得るエラーメッセージは次のとおりです。

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のテストを試しましたが、すべて合格しました。

私が間違っているのは何ですか?

事前にご協力いただきありがとうございます。

4

1 に答える 1

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)));
于 2012-06-05T10:09:50.930 に答える