我目前正在编写单元测试,使用来自我的一个模拟接口的方法。一切工作正常,但是当我向接口添加新方法时(接口与其基类之间的连接是正常的),我的单元测试项目中的模拟接口没有拾取新方法,抛出"方法未定义"错误。下面是我如何添加新方法的一个基本示例。
基类:
namespace MyProject.Business
{
public class MyProjectValidator: IValidator
{
private readonly IValidator mValidator;
public MyProject(IValidator validator)
{
this.mValidator= validator;
}
public bool myMethod()
{
return true;
}
public bool myNewMethod()
{
return true;
}
}
}
界面
namespace MyProject.Business
{
public interface IValidator
{
bool myMethod();
bool myNewMethod ();
}
}
单元测试(不同项目,相同解决方案)
using MyProject.Business;
namespace MyProject.Tests.Business
{
[TestClass]
public class MyProjectTests
{
[TestMethod]
public void testMethods()
{
var testValidator= new Mock<IValidator>();
var testMyProject= new MyProject(testValidator.Object);
var testOld = testValidator.myMethod(); // testOld = true
var testNew = testValidator.myNewMethod(); // error: myNewMethod() not defined
}
}
}
正如我上面所评论的,我新添加的方法没有被识别。我的旧方法是在创建单元测试项目之前创建的(我假设,我从以前的开发人员那里继承了代码)。我试图检查单元测试项目中链接失败的引用,但IValidator的所有功能都出现了。我试过重建和重新启动&重新构建解决方案和项目都无济于事。
任何关于为什么"myNewMethod()"在我的单元测试项目中没有被识别的指导都将不胜感激。
从@31eee384的注释来看,这个问题确实与缺乏对象引用有关。更改对testValidator.Object.myNewMethod();
的调用(对原始方法的接口的对象引用隐藏在其他地方)允许识别该方法。谢谢大家的意见!
这里的问题还在于您正在调用Mock的方法。您应该使用testValidator做的唯一事情是设置您的期望和调用结果,并进行一些验证(如果有的话)。你永远不应该从模拟中调用接口方法,因为它真的没有意义;您希望测试您的业务类,并将使用模拟来帮助您处理接口为您的业务类提供的任何相关行为。