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

时间:2018-02-23 14:59:42

标签: c# .net mocking moq

让我说我有这个

public interface ISomeInterface
{ 
  public string GetSomething();
}

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

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

我需要模拟

GetSomething()

以便更改

的字符串输出
MethodToTest()

所以我这样做了:

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


        Assert.Equal("DDDD", k);

问题是     GetSomething()

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

1 个答案:

答案 0 :(得分:5)

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

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

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

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());

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