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

3
假设我有以下内容:
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();?

2
你在声明和设置一个模拟对象,但是后面却使用了一个普通的Sample实例。你对GetSomething进行了模拟,做得很好,只是从未使用过它。 - undefined
那么我应该改变什么才能使它工作? - user9314289
1个回答

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

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


需要将其设置为覆盖吗? - user9314289
2
是的,如果你想在具体类型上模拟一个方法,它需要是虚拟的:https://github.com/Moq/moq4/wiki/Quickstart - undefined
只是一个快速的观察 - 在示例的最后一行,我假设s应该是mockSample吗? - undefined
@LordWilmore 太棒了,谢谢你发现了。我没有使用IDE,所以打得很快。 - undefined
1
在最后一行,应该是mockSample.Object.MethodToTest吗? - undefined
另外,难道不需要使用 { CallBase = true } 来初始化模拟对象吗?这样才能调用真实的方法。var mockSample = new Mock<Sample>() { CallBase = true }; - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接