首页 > 解决方案 > Autofac mock - 如何从依赖项中的特定方法设置/伪造数据?

问题描述

我很可能是单元测试、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件作品,似乎没有任何效果,这可能是因为我做错了一些基本的事情。

有人对如何挽救我的一天有见解吗?

标签: c#moqautofacxunit

解决方案


实现的成员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),则上述方法在执行时通过。


推荐阅读