用于单元测试的模拟dll方法

时间:2010-04-15 19:19:27

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

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

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

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

2 个答案:

答案 0 :(得分:2)

当使用第三方库不提供单元测试加倍测试的方法时,最好的方法是创建一个可测试的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);

那就是说,不要为库中的每个函数/类/方法执行此操作!这可能没有必要。只有在文件或网络通信等单元测试中无法控制的依赖外部资源的事物的两倍。

答案 1 :(得分:1)

如果您尝试存根的方法是虚拟,那么您应该能够存根,但如果没有,那么您最好的选择是围绕它制作一个包装,你可以残余部分。

示例:

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)
     {
      ..........
     }
}