C# 使用Autofixture、Moq和XUnit的类中的部分模拟方法
我只想模拟类的一些方法,并为其他方法调用真正的实现 我有我的sut类测试,其中Runner类被注入构造函数中。该注入类在构造函数中再次注入了另一个类RunnerParam 这段代码是我真正的类的一个简化例子,它试图只包含基本的内容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
[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);