c#“方法未定义”向模拟接口添加新方法时

本文关键字:接口 模拟 添加 新方法 方法 未定义 方法未定义 | 更新日期: 2023-09-27 18:10:49

我目前正在编写单元测试,使用来自我的一个模拟接口的方法。一切工作正常,但是当我向接口添加新方法时(接口与其基类之间的连接是正常的),我的单元测试项目中的模拟接口没有拾取新方法,抛出"方法未定义"错误。下面是我如何添加新方法的一个基本示例。

基类:

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()"在我的单元测试项目中没有被识别的指导都将不胜感激。

c#“方法未定义”向模拟接口添加新方法时

从@31eee384的注释来看,这个问题确实与缺乏对象引用有关。更改对testValidator.Object.myNewMethod();的调用(对原始方法的接口的对象引用隐藏在其他地方)允许识别该方法。谢谢大家的意见!

这里的问题还在于您正在调用Mock的方法。您应该使用testValidator做的唯一事情是设置您的期望和调用结果,并进行一些验证(如果有的话)。你永远不应该从模拟中调用接口方法,因为它真的没有意义;您希望测试您的业务类,并将使用模拟来帮助您处理接口为您的业务类提供的任何相关行为。