Moq extension method returns null

I am trying to check the result of some function when using an extension method call. This extension method is defined on the interface. The test setup creates an interface layout. Two settings are configured for this layout. When this settings function is called up when implementing the corrected interface, everything works as intended. (see TestMockSetupSourceClassA and TestMockSetupSourceClassB). But when these calls are made in the extension method, the result is zero. (see TestDoClassStuff)

I installed a test project: https://github.com/sschauss/MoqExtensionMethodTest

Extension

public static class ExtensionClass
{
    public static TResult DoExtensionStuff<TResult>(this ISomeInterface someInterface, object initialObject,
        params object[] objects)
    {
        var result = someInterface.DoInterfaceStuff<TResult>(initialObject);
        return objects.Aggregate(result, (agg, cur) => someInterface.DoInterfaceStuff(cur, agg));
    }
}

Implementation

public class SomeClass
{
    private readonly ISomeInterface _someInterface;

    public SomeClass(ISomeInterface someInterface)
    {
        _someInterface = someInterface;
    }

    public TargetClass DoClassStuff(SourceClassA sourceClassA, SourceClassB sourceClassB)
    {
        return _someInterface.DoExtensionStuff<TargetClass>(sourceClassA, sourceClassB);
    }
}

Test

public class UnitTest
{
    private readonly SomeClass _sut;
    private readonly SourceClassA _sourceA;
    private readonly SourceClassB _sourceB;
    private readonly TargetClass _target;
    private readonly Mock<ISomeInterface> _someInterfaceMock;

    public UnitTest()
    {
        _sourceA = new SourceClassA
        {
            Integer = 1
        };
        _sourceB = new SourceClassB
        {
            String = "stringB"
        };
        _target = new TargetClass
        {
            Integer = 2,
            String = "stringT"
        };
        _someInterfaceMock = new Mock<ISomeInterface>();
        _someInterfaceMock.Setup(m => m.DoInterfaceStuff<TargetClass>(_sourceA)).Returns(_target);
        _someInterfaceMock.Setup(m => m.DoInterfaceStuff(_sourceB, _target)).Returns(_target);
        _sut = new SomeClass(_someInterfaceMock.Object);
    }

    [Fact]
    public void TestDoClassStuff()
    {
        var result = _sut.DoClassStuff(_sourceA, _sourceB);

        result.Should().BeEquivalentTo(_target);
    }

    [Fact]
    public void TestMockSetupSourceClassA()
    {
        var result = _someInterfaceMock.Object.DoInterfaceStuff<TargetClass>(_sourceA);

        result.Should().BeEquivalentTo(_target);
    }

    [Fact]
    public void TestMockSetupSourceClassB()
    {
        var result = _someInterfaceMock.Object.DoInterfaceStuff(_sourceB, _target);

        result.Should().BeEquivalentTo(_target);
    }
}
+4
source share
1 answer

Aggregate, , Setup.

params DoExtensionStuff object, `

T2 DoInterfaceStuff<T1, T2>(T1 parameter1, T2 parameter2)

Aggregate,

 (TResult agg, object cur) => someInterface.DoInterfaceStuff<object,TResult>(cur, agg)

.

_someInterfaceMock.Setup, ,

 _someInterfaceMock
    .Setup(m => m.DoInterfaceStuff<object, TargetClass>(_sourceB, _target))
    .Returns(_target);

.

Moq , , , null .

+4

Source: https://habr.com/ru/post/1696095/


All Articles