Макетные dll методы для юнит-тестов - PullRequest
2 голосов
/ 15 апреля 2010

Я пытаюсь написать модульный тест для метода, который имеет вызов метода из DLL. Есть ли в любом случае, я могу издеваться над методами DLL, чтобы я мог модульный тест?

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

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

Ответы [ 2 ]

2 голосов
/ 15 апреля 2010

При использовании сторонней библиотеки, которая не предоставляет средства удвоения теста для модульного тестирования, лучше всего создать дублируемый тест Фасад . Создайте класс, единственной обязанностью которого является предоставление тестируемого дублируемого интерфейса в стороннюю библиотеку. Он ничего не делает, только передает вызовы в библиотеку, но делает это так, что вы можете связать его с абстракцией и высмеять.

Например:

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 голос
/ 15 апреля 2010

Если метод, который вы пытаетесь заглушить, это виртуальный , то вы должны иметь возможность заглушки, но если нет, то вам лучше всего сделать обертку вокруг него, которую вы можете заглушить .

Пример:

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