如何模拟从另一个方法调用的方法

2 .net c# moq mocking

让我们说我有这个

public interface ISomeInterface
{ 
  public string GetSomething();
}

public class Sample : ISomeInterface
{
   public string GetSomething()
    {
        return "HELLO";
    }

    public string MethodToTest()
    {
        return GetSomething();
    }
}
Run Code Online (Sandbox Code Playgroud)

我需要嘲笑

GetSomething()
Run Code Online (Sandbox Code Playgroud)

为了改变字符串输出

MethodToTest()
Run Code Online (Sandbox Code Playgroud)

所以我这样做了:

var mockClientConfigExtensions = new Mock<ISomeInterface>();
        mockClientConfigExtensions.Setup(ss => ss.GetSomething()).Returns("DDDD");
        var _os = new Sample();
        var k = _os.MethodToTest();


        Assert.Equal("DDDD", k);
Run Code Online (Sandbox Code Playgroud)

问题是GetSomething()

仍然返回HELLO而不是嘲笑它.我如何模拟GetSomething(); ?

Owe*_*ing 5

您使用安装程序的模拟界面是mockClientConfigExtensions,但您正在测试的实例k是一种具体类型,与您执行安装程序的实例完全不同.

这不是你应该嘲笑的方式.通常你会模拟被测试类的依赖关系,然后对它们进行设置.

如果你真的必须模拟测试中的类,那么你需要在不在接口上的具体实例上实际设置方法.您还需要使您想要模拟虚拟的方法.例如:

public class Sample : ISomeInterface
{
   public virtual string GetSomething()
    {
        return "HELLO";
    }

    public string MethodToTest()
    {
        return GetSomething();
    }
}

...

var mockSample = new Mock<Sample>();
mockSample.Setup(s => s.GetSomething()).Returns("mystring");
Assert.Equal("mystring", mockSample.Object.MethodToTest());
Run Code Online (Sandbox Code Playgroud)

https://github.com/Moq/moq4/wiki/Quickstart

  • 是的,如果你想模拟具体类型的方法,它需要是虚拟的:https://github.com/Moq/moq4/wiki/Quickstart (2认同)