繁体   English   中英

Autofac mock - 如何设置/伪造依赖项中特定方法的数据?

[英]Autofac mock - How do I setup/fake data from specific methods in dependencies?

我不熟悉单元测试,Autofac和模拟很可能,这相对容易,但我很难搞清楚。

我有这个类SystemUnderTest有一个依赖,有两个方法GetValueOneGetValueTwo

public class SystemUnderTest : ISystemUnderTest
{
    private readonly IDependency _dependency;

    public SystemUnderTest(IDependency dependency)
    {
        _dependency = dependency;
    }

    public string GetValueOne()
    {
        return _dependency.GetValueOne();
    }

    public string GetValueTwo()
    {
        return _dependency.GetValueTwo();
    }
}

public interface ISystemUnderTest
{
    string GetValueOne();
    string GetValueTwo();
}

这些方法从依赖项中获取数据。

public class Dependency : IDependency
{
    public string GetValueOne()
    {
        return "get-value-one";
    }
    public string GetValueTwo()
    {
        return "get-value-two";
    }
}

public interface IDependency
{
    string GetValueOne();
    string GetValueTwo();
}

我试图伪造其中一个方法(“ GetValueTwo ”)的数据,因此它返回"expected value"而不是"get-value-two" ,这是依赖性通常返回的。

[Fact]
public async Task Test_SystemUnderTest()
{
    using (var mock = AutoMock.GetLoose())
    {
        // Setup
        mock.Mock<IDependency>().Setup(x => x.GetValueTwo()).Returns("expected value");

        // Configure
        mock.Provide<IDependency, Dependency>();

        // Arrange - configure the mock
        var sut = mock.Create<SystemUnderTest>();

        // Act
        var actual_GetValueOne = sut.GetValueOne();
        var actual_GetValueTwo = sut.GetValueTwo();

        // Assert - assert on the mock
        Assert.Equal("get-value-one", actual_GetValueOne);
        Assert.Equal("expected value", actual_GetValueTwo);
    }
}

在我的测试的第一部分, Setup件,似乎没有任何影响,它可能是因为我做了一些基本的错误。

任何有关如何挽救我一天的见解的人?

在进行部分模拟时, Dependency实现的成员需要具有虚拟成员才能覆盖它们。

public class Dependency : IDependency {
    public virtual string GetValueOne() {
        return "get-value-one";
    }
    public virtual string GetValueTwo() {
        return "get-value-two";
    }
}

然后类似于另一个答案中的建议,您将改为模拟实现,确保启用它来调用基本成员并仅设置您需要覆盖的成员。

public void Test_SystemUnderTest() {
    using (var mock = AutoMock.GetLoose()) {
        // Setup
        var dependency = mock.Mock<Dependency>();
        dependency.CallBase = true;
        dependency.Setup(x => x.GetValueTwo()).Returns("expected value");

        // Configure
        mock.Provide<IDependency>(dependency.Object);

        // Arrange - configure the mock
        var sut = mock.Create<SystemUnderTest>();

        // Act
        var actual_GetValueOne = sut.GetValueOne();
        var actual_GetValueTwo = sut.GetValueTwo();

        // Assert - assert on the mock
        Assert.AreEqual("get-value-one", actual_GetValueOne);
        Assert.AreEqual("expected value", actual_GetValueTwo);
    }
}

执行上述过程,前提是需要virtual的实现成员可以被覆盖(即virtual )。

不是编写单元测试的专家,但我很确定通过使用Provide和两个类型参数,您可以覆盖之前执行的Setup部分。 根据我的理解, Provide方法应该用于提供你自己的目标接口的模拟实现,因此同时使用Provide和两个类型参数以及相同依赖项的Setup是没有意义的。

因此,您可以修改Dependency实现的GetValueTwo以返回"expected value"并使用未经修改的其余代码,或者您可以使用一个类型参数Provide方法Provide模拟实例,并使用以前设置的两种方法,如下所示:

    [Fact]
    public async Task Test_SystemUnderTest()
    {
        using (var mock = AutoMock.GetLoose())
        {
            var mockedDependency = mock.Mock<IDependency>();

            // Setup
            mockedDependency.Setup(x => x.GetValueOne()).Returns("get-value-one");
            mockedDependency.Setup(x => x.GetValueTwo()).Returns("expected value");

            // The following line is not even necessary
            mock.Provide<IDependency>(mockedDependency.Object);

            // Arrange - configure the mock
            var sut = mock.Create<SystemUnderTest>();

            // Act
            var actual_GetValueOne = sut.GetValueOne();
            var actual_GetValueTwo = sut.GetValueTwo();

            // Assert - assert on the mock
            Assert.Equal("get-value-one", actual_GetValueOne);
            Assert.Equal("expected value", actual_GetValueTwo);
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM