0

在下面的代码片段中,我试图模拟受保护方法的响应并测试调用受保护方法的公共方法的响应。受保护方法调用外部 API,因此我想模拟响应以测试调用受保护方法的公共方法。

当我尝试注入对公共方法使用的类的依赖项时,就会出现问题。它总是转到默认构造函数,忽略我传递的依赖对象。请让我知道我在哪里错过了更改。注意:我添加了默认构造函数只是为了理解流程。我不会在真正的实现中使用它。

测试方法

[Fact]
public void Test()
{
    using (var mock = AutoMock.GetLoose())
    {
        Depdency1 depdency1 = new Depdency1();
        Depdency2 depdency2 = new Depdency2();

        var parm1 = new NamedParameter("dependency1", depdency1);
        var parm2 = new NamedParameter("dependency2", depdency2);

        //Mock the protected method
        mock.Mock<SystemUnderTest>(parm1, parm2)
           .Protected()
           .Setup<bool>("IsOrderValid", "TestOrder")
           .Returns(true);

        var sut = mock.Create<SystemUnderTest>();

        sut.ProcessOrder("Test");
    }
}

主班

public class SystemUnderTest : ISystemUnderTest
{
    private readonly IDependency1 _dependency1;
    private readonly IDependency2 _dependency2;

    public SystemUnderTest()
    {

    }
    public SystemUnderTest(IDependency1 dependency1, IDependency2 dependency2)
    {
        _dependency1 = dependency1;
        _dependency2 = dependency2;
    }

    public bool ProcessOrder(string OrderID)
    {
        //Businss logic using dependency1
        if (IsOrderValid(OrderID))
        {

            if (_dependency1 == null)
            {
                throw new AggregateException("Depdency1 is null");
            }
            //Businss logic
            return true;
        }
        else
        {
            if (_dependency1 == null)
            {
                throw new AggregateException("Depdency1 is null");
            }
            //Businss logic
            return false;
        }
    }

    protected virtual bool IsOrderValid(string OrderID)
    {
        //Business logic using dependency2
        if (_dependency2 == null)
        {
            throw new AggregateException("Depdency2 is null");
        }
        return true; //False based on logic
    }
}

public interface IDependency1
{
    void Method1();
}

public interface IDependency2
{
    void Method2();
}

public class Depdency1 : IDependency1
{
    private int _property1;
    public void Method1()
    {
        throw new NotImplementedException();
    }
}
public class Depdency2 : IDependency2
{
    private int _property2;
    public void Method2()
    {
        throw new NotImplementedException();
    }
}
4

0 回答 0