【问题标题】:Error on testing method测试方法错误
【发布时间】:2015-10-03 12:25:27
【问题描述】:

我的工作方法,需要测试:

using TCatSysManagerLib; // for TcSysManager
public static int ProcessPositionBias(TcSysManager tcsm)
{
    // method body here
    return 0;
}

现在在测试单元中我尝试模拟 TcSysManager,因为它适用于硬件,在测试期间不可用,我什至无法使用它:

namespace TestClient
{
    [TestClass]
    public class UnitTestClient
    {
        [TestMethod]
        public void TestVersion()
        {
            Mock<TcSysManager> tcsm = new Mock<TcSysManager>();
        
            int r = ClientProgram.ProcessPositionBias(tcsm.Object); // errors here
        
        }
    }

    public TcSysManager
    {
        // I promise to implement some methods which I use in my app
    }
}

编译器基本上抱怨 3 件事:

错误 1 ​​类型“TCatSysManagerLib.TcSysManager”在 未引用的程序集。您必须添加对程序集的引用 'Interop.TCatSysManagerLib,版本=1.1.0.0,文化=中性, PublicKeyToken=null'。

错误 2 最好的重载方法匹配 'Client.ClientProgram.ProcessPositionBias(TCatSysManagerLib.TcSysManager)' 有一些无效 论据

错误 3 参数 1:无法从 'TestClient.TcSysManager' 转换为 'TCatSysManagerLib.TcSysManager'

【问题讨论】:

  • 你有什么问题?
  • “您必须添加对程序集 'Interop.TCatSysManagerLib, Version=1.1.0.0, Culture=neutral, PublicKeyToken=null' 的引用。” ?
  • 对于单元测试我不能这样做,因为该库仅在“特殊计算机”上可用。
  • 据我所知,您唯一真正的选择是创建一个与“特殊库”具有相同名称空间和版本的模拟库,并在本地测试中引用它,假设它不是t签名或任何东西。否则我看不出有什么东西可以建造。

标签: c# unit-testing moq


【解决方案1】:

错误告诉你出了什么问题。您不能只为类型提供相同的名称,您需要与您调用的方法所需的完全相同的类型。

另一种方法是向TcSysManager 引入一个接口,在单独的程序集中声明,并为该接口设置方法参数的类型。

【讨论】:

  • 看起来是在应用程序本身中声明接口的唯一方法。
  • Interop.TCatSysManagerLib 和单元测试项目都必须引用声明接口的程序集。
  • 我在我的应用程序中创建了一个适配器类,其中引用了 TCatSysManagerLib,同时单元测试项目引用了应用程序。看起来错误消失了。我将尝试在测试项目中创建存根。
  • 我没想到。当然,这也是一种选择,只要您不公开该包装器中的 TCatSysManagerLib 类型即可。然后ProcessPositionBias() 必须使用您的适配器类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-18
  • 2019-06-08
  • 1970-01-01
相关资源
最近更新 更多