5

置換された呼び出しに渡されたパラメーターが一致しないため、NSubstitute で失敗したテストがあります。テストされている関連コードは次のとおりです。

// Arrange
PermissionsProviderSub = Substitute.For<IPermissionsProvider>();
MenuDataProviderSub = Substitute.For<IMenuDataProvider>();
PermissionsProviderSub.GetPermissions(UserId).Returns(ExpectedUserPermissions);
MenuDataProviderSub.GetMenuData(ExpectedUserPermissions.AuthorisedPageIds).Returns(Arg.Any<IList<BusinessFocusArea>>());            
var sut = new MenuViewModelFactory(MenuDataProviderSub, PermissionsProviderSub);

// Act
var result = sut.Create();

// Assert
MenuDataProviderSub.Received().GetMenuData(ExpectedUserPermissions.AuthorisedPageIds);

この問題は、ExpectedUserPermissions.AuthorisedPageIds次のようなプロパティで発生します。

public IEnumerable<string> AuthorisedPageIds
{
    get
    {
        return ApplicationPagePermissions != null ? 
            ApplicationPagePermissions.Select(permissionSet => permissionSet.PageId) :
            Enumerable.Empty<string>();
    }
}

ご覧のとおり、コレクションPageId内からプロパティを抽出し、それを として返す LINQ Select があります。そのプロパティ内のプロジェクションは新しいオブジェクトを作成するため、2 つのオブジェクトが異なるものとして認識されるため、置換は一致しません。ApplicationPagePermissionsIEnumerable<string>

渡されたパラメータにコールバックを作成して、GetMenuDataその値を調べることはできますか?

NSubstitute コールバックに関するドキュメントでは、呼び出しに渡されるパラメーターではなく、呼び出しからの戻り値の調査についてのみ説明しています。

4

1 に答える 1

6

典型的。SOに投稿するとすぐに、答えが表示されます。代替呼び出しを作成するときに特定のオブジェクトを想定するのではなく、型の任意のインスタンスを想定し、値を実際に検証する呼び出しをIEnumerable<string>チェックするときにコールバックを作成します。Received()代替呼び出しは次のようになります。

MenuDataProviderSub.GetMenuData(Arg.Any<IEnumerable<string>>()).Returns(Arg.Any<IList<BusinessFocusArea>>());            

チェックは次のReceived()ようになります。

MenuDataProviderSub.Received().GetMenuData(Arg.Is<IEnumerable<string>>(a => VerifyPageIds(ExpectedUserPermissions.AuthorisedPageIds, a)));

private static bool VerifyPageIds(IEnumerable<string> expected, IEnumerable<string> actual)
{
    var expectedIds = expected.ToList();
    var actualIds = actual.ToList();
    return expectedIds.Count == actualIds.Count && expectedIds.All(actualIds.Contains);
}
于 2013-02-22T14:51:31.680 に答える