【问题标题】:Mock dll methods for unit tests用于单元测试的模拟 dll 方法
【发布时间】:2010-04-15 19:19:26
【问题描述】:

我正在尝试为一个方法编写单元测试,该方法从 dll 调用方法。无论如何我可以模拟 dll 方法以便进行单元测试吗?

public string GetName(dllobject, int id)
{
     var eligibileEmp = dllobject.GetEligibleEmp(id); <---------trying to mock 
                                                                 this method

     if(eligibleEmp.Equals(empValue)
     {
      ..........
     }
}

【问题讨论】:

  • 为什么不能使用实际的 DLL 作为测试的一部分?查看代码,您似乎应该做的是创建一个测试员工对象,您可以将其作为测试的一部分返回。假设这不是测试的关键方面。
  • @Harv 如果 dll 对象命中数据库怎么办?您无法确定该行为涉及到什么,这可能就是他想要 stub 它的原因。
  • @Joseph,你是对的,dll 访问了数据库,所以我想模拟它

标签: c# unit-testing mocking rhino-mocks


【解决方案1】:

当使用不提供用于单元测试的双重测试方法的第三方库时,最好的办法是创建一个双重测试Facade。创建一个类,其唯一职责是为第三方库提供一个可测试的双重接口。它除了将调用传递给库之外什么都不做,但它这样做是为了让您可以绑定它的抽象并模拟它。

例如:

public interface IMyDllObject
{
   object DllObject { get; set; }
   object GetEligibleEmp(int id);
}

public class MyDllObject : IMyDllObject
{
   object DllObject { get; set; }
   object GetEligibleEmp(int id)
   {
       DllObject.GetEligibleEmp(id);
   }
}

// elsewhere in your code:
IMyDllObject myDllObject = CreateMyDllObject(); // Factory method, can return test double

// elsewhere elsewhere
var eligibleEmp = myDllObject.GetEligibleEmp(id);

也就是说,不要对库中的每个函数/类/方法都这样做!这可能没有必要。仅将依赖于您在单元测试中无法控制的外部资源(例如文件或网络通信)的事情加倍。

【讨论】:

    【解决方案2】:

    如果您尝试存根的方法是 virtual,那么您应该能够存根,但如果不是,那么最好的办法是围绕它制作一个包装器,您可以存根。

    例子:

    internal class EmployeeWrapper
    {
        RealEmployeeFactory EmployeeFactory {get; set;}
    
        public virtual RealEmployee GetEligibleEmp(int id)
        {
            return EmployeeFactory.GetEligibleEmp(id);
        }
    } 
    

    我只是在猜测您的班级结构,因为您的问题中没有,但我想您明白了。

    然后你会像这样改变你的方法:

    public string GetName(EmployeeWrapper employee, int id)
    {
         var eligibileEmp = employee.GetEligibleEmp(id); <---------you can stub this
    
         if(eligibleEmp.Equals(empValue)
         {
          ..........
         }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-04-16
      • 2015-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-07
      • 2022-08-02
      • 1970-01-01
      • 2018-07-12
      相关资源
      最近更新 更多