4

NUnit、Moq、StructureMap を使用しています。

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

    [Test]
    public void ShouldCallCustomMethod_ForAllICustomInterfaceMocks()
    {
        var customInterfaceMock1 = new Mock<ICustomInterface>();
        var customInterfaceMock2 = new Mock<ICustomInterface>();

        ObjectFactory.Inject(customInterfaceMock1.Object);
        ObjectFactory.Inject(customInterfaceMock2.Object);

        var sut = new SUT();
        sut.MethodThatShouldCallCustomMethodOnMocks();

        customInterfaceMock1.Verify(m => m.CustomMethod());
        customInterfaceMock2.Verify(m => m.CustomMethod());
    }

ICustomInterface:

public interface ICustomInterface
{
    IEnumerable<Type> CustomMethod();
}

SUT クラスの実装が次のようになっている場合:

public class SUT
{
    public IEnumerable<Type> MethodThatShouldCallCustomMethodOnMocks()
    {
        var result = ObjectFactory.GetAllInstances<ICustomInterface>()
             .SelectMany(i => i.CustomMethod());


        return result;
    }
}

メソッド CustomMethod がモックで呼び出されていないため、上記のテストは失敗します。ただし、SUT クラスの実装を次のように変更すると:

public class SUT
{
    public IEnumerable<Type> MethodThatShouldCallCustomMethodOnMocks()
    {
        var customInterfaceInstances = ObjectFactory.GetAllInstances<ICustomInterface>();

        foreach (var instance in customInterfaceInstances)
              instance.CustomMethod();


        return ...
    }
}

テスト合格!違いは、SelectMany を反復する代わりに foreach を使用することですが、テスト結果が異なります (2 番目のケースでは、CustomMethods がモックで呼び出されます)。

誰かがその行動を説明できますか?

4

1 に答える 1

8

これは、実行の延期のケースである可能性があると思います。SelectManyすぐには実行されません。メソッドを呼び出すにはIEnumerable、返される を列挙する必要があります。ToList()メソッドの後に追加して、返された fromSelectMany()を強制的に評価してみてください。IEnumerableSelectMany

于 2013-11-13T13:14:05.300 に答える