我只想模拟类的某些方法,并为其他方法调用真正的实现。
我有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,因此应该采用真正的实现,但事实并非如此。
我在这里想念什么?
[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);
//...