使用Autofixture,Moq和XUnit的类中的部分模拟方法

问题描述 投票:0回答:1

我只想模拟类的某些方法,并为其他方法调用真正的实现。

我有sut类Test,其中Runner类已注入构造函数中。此注入的类在构造函数中再次注入了另一个类RunnerParam。该代码是我的真实类的简化案例,试图只具有基础知识。

[Fact]
public void Test()
{
    var fixture = new Fixture().Customize(new AutoMoqCustomization());

    var paramMock = fixture.Freeze<Mock<IRunnerParam>>();
    paramMock.Setup(x => x.Multiplicator()).Returns(2);

    var classMock = fixture.Freeze<Mock<IRunner>>();
    classMock.Setup(x => x.Run()).Returns(5);

    var test = fixture.Create<Test>();

    var result = test.StartRunning();  // should be 5
    var result2 = test.StartRunningImplementation(5); // should be 500
}

public interface IRunnerParam
{
    int Multiplicator();
}

public class RunnerParam : IRunnerParam
{
    public virtual int Multiplicator()
    {
        return 20;
    }
}

public interface IRunner
{
    int Run();
    int RunImplementation(int param);
}

public class Runner : IRunner
{
    protected virtual RunnerParam MultiParam { get; set; }
    public Runner(RunnerParam multiParam)
    {
        MultiParam = multiParam;
    }

    public virtual int Run()
    {
        return 10;
    }

    public int RunImplementation(int param)
    {
        return 10 * MultiParam.Multiplicator() * param * Run();
    }
}

public class Test
{
    private readonly IRunner _runner;
    public Test(IRunner runner)
    {
        _runner = runner;
    }

    public int StartRunning()
    {
        return _runner.Run();
    }

    public int StartRunningImplementation(int param)
    {
        return _runner.RunImplementation(param);
    }
}

[我想模拟并为类Runner中的Run方法提供模拟值,但要使用RunImplementation方法的真实实现。

我希望看到result2 500,但是它是0,这意味着该方法没有被模拟。在我看来,这是正确的,但是Moq调用基等于true,因此应该采用真正的实现,但事实并非如此。

我在这里想念什么?

moq xunit autofixture
1个回答
0
投票

[Test仅取决于IRunner

private readonly IRunner _runner;
public Test(IRunner runner)
{
    _runner = runner;
}

因此,如果要单独测试Test类,那么这就是所有需要嘲笑的事情。

//...

var classMock = fixture.Freeze<Mock<IRunner>>();
classMock.Setup(x => x.Run()).Returns(5);
classMock.Setup(x => x.RunImplementation(It.IsAny<int>())).Returns(500);

//...
© www.soinside.com 2019 - 2024. All rights reserved.