向模拟接口

时间:2015-09-02 16:07:17

标签: c# unit-testing interface

我目前正在编写使用我的一个模拟接口中的方法的单元测试。一切正常,但是当我向接口添加一个新方法(接口和它的基类之间的连接很好)时,单元测试项目中的模拟接口没有选择新方法,抛出一个“未定义的方法” “错误。这是我如何添加新方法的基本示例。

基类:

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的所有功能都出现了。我尝试过重建和重启&amp;重建解决方案和项目无济于事。

有关为什么“myNewMethod()”未在我的单元测试项目中被识别的任何指导将不胜感激。

更新:根据要求添加了使用行。

2 个答案:

答案 0 :(得分:0)

关于@ 31eee384的评论,问题确实与缺少对象引用有关。将调用更改为testValidator.Object.myNewMethod();(原始方法的接口的对象引用已隐藏在其他位置)允许识别该方法。谢谢大家的投入!

答案 1 :(得分:0)

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