Недавно я выполнял свой первый проект разработки через тестирование и изучал Ninject и MOQ. Это моя первая попытка все это сделать. Я обнаружил, что подход TDD заставляет задуматься, а Ninject и MOQ оказались великолепными. Проект, над которым я работаю, не особенно подходит для Ninject, поскольку это программа на C # с широкими возможностями настройки, предназначенная для тестирования использования интерфейса веб-службы.
Я разбил его на модули и имею интерфейсы по всему магазину, но я все еще обнаружил, что мне приходится использовать множество аргументов конструктора при получении реализации службы из ядра Ninject. Например:
В моем модуле Ninject;
Bind<IDirEnum>().To<DirEnum>()
Мой класс DirEnum;
public class DirEnum : IDirEnum
{
public DirEnum(string filePath, string fileFilter,
bool includeSubDirs)
{
....
В моем классе Configurator (это основная точка входа), который объединяет все службы вместе;
class Configurator
{
public ConfigureServices(string[] args)
{
ArgParser argParser = new ArgParser(args);
IDirEnum dirEnum = kernel.Get<IDirEnum>(
new ConstructorArgument("filePath", argParser.filePath),
new ConstructorArgument("fileFilter", argParser.fileFilter),
new ConstructorArgument("includeSubDirs", argParser.subDirs)
);
filePath, fileFilter и includeSubDirs являются командами строчные параметры программы. Все идет нормально. Однако, будучи человеком сознательным, у меня есть тест, охватывающий этот фрагмент кода. Я хочу использовать объект MOQ. Я создал модуль Ninject для своих тестов;
public class TestNinjectModule : NinjectModule
{
internal IDirEnum mockDirEnum {set;get};
Bind<IDirEnum>().ToConstant(mockDirEnum);
}
И в своем тесте я использую его так:
[TestMethod]
public void Test()
{
// Arrange
TestNinjectModule testmodule = new TestNinjectModule();
Mock<IDirEnum> mockDirEnum = new Mock<IDirEnum>();
testModule.mockDirEnum = mockDirEnum;
// Act
Configurator configurator = new Configurator();
configurator.ConfigureServices();
// Assert
here lies my problem! How do I test what values were passed to the
constructor arguments???
Итак, приведенное выше показывает мою проблему. Как я могу проверить, какие аргументы были переданы в ConstructorArguments фиктивного объекта? Я предполагаю, что в этом случае Ninject распределяет ConstuctorArguments, поскольку Bind их не требует? Могу ли я проверить это с помощью объекта MOQ или мне нужно вручную создать код фиктивного объекта, который реализует DirEnum и принимает и «записывает» аргументы конструктора?
n.b. этот код является «примерным» кодом, т.е. я не воспроизвел свой код дословно, но я думаю, что я выразил достаточно, чтобы, надеюсь, передать проблемы? Если вам нужно больше контекста, спросите!
Спасибо за внимание. Будьте осторожны, это мой первый раз; -)
Джим