C# 使用Autofixture、Moq和XUnit的类中的部分模拟方法

C# 使用Autofixture、Moq和XUnit的类中的部分模拟方法,c#,unit-testing,moq,xunit,autofixture,C#,Unit Testing,Moq,Xunit,Autofixture,我只想模拟类的一些方法,并为其他方法调用真正的实现 我有我的sut类测试,其中Runner类被注入构造函数中。该注入类在构造函数中再次注入了另一个类RunnerParam 这段代码是我真正的类的一个简化例子,它试图只包含基本的内容 [Fact] public void Test() { var fixture = new Fixture().Customize(new AutoMoqCustomization()); var paramMock = fixture.Freeze

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

我有我的sut类测试,其中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
}
我想模拟并给类运行器中运行的方法一个模拟值,但要使用方法RunImplementation的实际实现

protected virtual IRunnerParam MultiParam { get; set; }
public Runner(IRunnerParam multiParam) {
    MultiParam = multiParam;
}
我希望看到result2500,但它是0,这意味着该方法不被视为模拟。在我看来,这是正确的,但Moq callbase等于true,因此应该采用真正的实现,但事实并非如此


这里我遗漏了什么?

在所示的简化示例中,
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);

//...
这简化了原始问题中描述的独立测试

我想模拟并给类运行器中运行的方法一个模拟值,但要使用方法RunImplementation的实际实现

protected virtual IRunnerParam MultiParam { get; set; }
public Runner(IRunnerParam multiParam) {
    MultiParam = multiParam;
}
//排列
var fixture=new fixture().Customize(new AutoMoqCustomization());
var runnerParam=fixture.Freeze()
.Setup(=>0.Multiplicator())
.申报表(2);
var subjectMock=fixture.Freeze();
subjectMock.CallBase=true;
subjectMock.Setup(=>wk.Run())。返回(5);
int预期=500;
Runner sut=subjectMock.Object;
//表演
var-actual=sut.RunImplementation(5);//应该是500
//断言
实际值应为(预期值);

我明白你的意思。这确实是一条路,一个接一个地测试这些类,而不是试图在一次测试中完成它们。
//Arrange
var fixture = new Fixture().Customize(new AutoMoqCustomization());

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

var subjectMock = fixture.Freeze<Mock<Runner>>();
subjectMock.CallBase = true;
subjectMock.Setup(_ => _.Run()).Returns(5);

int expected = 500;
Runner sut = subjectMock.Object;

//Act
var actual = sut.RunImplementation(5); // should be 500

//Assert
actual.Should().Be(expected);