让我说我有这个
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(); ?
答案 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());