2016-11-29 2 views
3

Я хочу протестировать метод со следующей подписью.Стыковка класса без интерфейса или виртуальных методов

int SomeMethod(List<Employee> employees) 

Вот соответствующие классы

public class Employee 
{ 
    public int CustomerID { get; set; } 
    public string LastName { get; set; } 
    public string FirstName { get; set; } 
    public Address Address { get; set; } 

} 

public class Address 
{ 
    public string StreetName { get; set; } 
    public string CityName { get; set; } 
    public string State { get; set; } 
    public string Country { get; set; } 
    public string ZipCode { get; set; } 
} 

Как я могу дразнить List<Employee> в качестве вклада в SomeMethod? Обратите внимание, что классы Employee и Address не имеют интерфейса или виртуального метода.

+2

Ваши классы - это модели. Почему вы насмехаетесь над моделями? У них нет никаких функций. – kat1330

+0

Можете ли вы предоставить свой тестовый пример и метод, который вы хотите проверить? – kat1330

+0

Это правильно, это модель, но предположим, что SomeMethod имеет некоторую бизнес-логику, которую я хочу протестировать. Это не хороший сценарий для тестирования? –

ответ

7

Если вы хотите протестировать метод со следующей подписью int SomeMethod(List<Employee> employees), вам не нужно издеваться Employee!

Необходимо создать List<Employee> employees = new List<Employee>(), перейти к способу и подтвердить результат!

Employee и Address - это модели без каких-либо функциональных возможностей, и вам не нужно их издеваться!

Вот две мысли о вашем случае:

  1. Вы можете легально называть new Employee() или new Address() в вашем методе, потому что код проверяемой! Создание новых экземпляров моделей не выполняет внешнюю зависимость.

  2. Будет проблема позвонить new Employee() или new Address(), только если у них есть функции. В этом случае вы будете выполнять реальную зависимость, которая, возможно, не тестируется! Например, если Employee или Address связывается с базой данных, он не тестируется, потому что он будет подключаться к реальной базе данных при выполнении теста. Чем вам нужно создать макет, чтобы избежать подключения к базе данных.

2

Без интерфейса или общего базового класса между Employee и вашим макетным объектом вы не можете передать какой-либо объект, кроме Employee.

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

Смежные вопросы