1

Я пытаюсь запустить следующий код с Ninject.Moq:Почему не происходит следующее издевательство над Ninject.Moq?

[TestMethod] 
public void TestMethod1() 
{ 
    var kernel = new MockingKernel(); 
    var engine = kernel.Get<ABC>(); 

    //as I don't need to actually use the interfaces, I don't want 
    //to even have to bother about them. 

    Assert.AreEqual<string>("abc", engine.ToString()); 
} 

А вот определение ABC класс:

public class ABC { 
    IA a; 
    IB b; 

    public ABC(IA a, IB b) 
    { 
     this.a = board; 
     this.b = war; 
    } 

    public override string ToString() 
    { 
     return "abc"; 
    } 
} 

Я получаю следующее исключение:

System.ArgumentException: Соответствующий конструктор для данных аргументов не найден на издеваемом типе. ---> System.MissingMethodException: Конструктор по типу 'AbcProxya759aacd0ed049f3849aaa75e2a7bade' не найден.

ответ

3

Хорошо, это будет сделать код работы:

[TestMethod] 
public void TestMethod1() 
{ 
    var kernel = new MockingKernel(); 
    kernel.Bind<Abc>().ToSelf(); 
    var engine = kernel.Get<ABC>(); 

    //as I don't need to actually use the interfaces, I don't want 
    //to even have to bother about them. 

    Assert.AreEqual<string>("abc", engine.ToString()); 
} 

Надо привязать Abc к себе, в противном случае он будет также получить издевались и Moq поддерживает только насмешливые классы без параметров, что это не так.

2

Немного похоже на understanding DI in the first place: - маленькие образцы на самом деле не получают всю точку.

Акустический контейнер, такой как Ninject.Moq (или аналогичные библиотеки инфраструктуры тестирования, такие как AutoFixture), на самом деле трудно объяснить простым примером. Я бы предложил прочитать all of Mark Seemann's posts on AutoFixture как способ получить представление об этом требовании.

Так Ninject.Moq будет иметь дело с цепочкой, N уровней вложенности набора окурка реализаций интерфейсов, которые необходимы, чтобы удовлетворить вашу испытуемую систему в ходе выполнения вещи вашего тест на самом деле должен быть тестирование.

В общем, вы хотите, чтобы короткие легко читаемые, легко тестируемые тесты с минимальной сложностью и взаимодействие светильников под обложкой (без большой иерархии базовых классов или с помощью 6 различных магических методов, выполняющих дурацкие срывы и вызывающие базовые классы). Как правило, эта цель будет означать, что вы должны держать свои инструменты на расстоянии от ваших модульных тестов.

automocking контейнер должен, как пилой, можно использовать только там, где вы собираетесь получить signnificant реальную отдачу (многие короче, легче понять тесты) для вас инвестиций (еще один инструмент, чтобы понять, прежде чем другие могут прочитать вы тестируете, больше отладки, больше сюрпризов, больше сложностей, которые приведут к хрупким, не поддающимся проверке испытаниям).

+0

Благодарим за описание. Но, учитывая приведенный пример, знаете ли вы, что я делаю что-то неправильно? –

+1

@devoured elysium: Я считаю, что контейнер для автомоек должен позволять использовать, как вы уже выше. AutoFixture, конечно же, позволяет использовать (то, что я использую). Честно говоря, ваш вопрос оставляет меня в замешательстве относительно того, что бит запутывает/не работает для вас (или какое из них описывает вашу ситуацию). ... следовательно, общий ответ ... Возможно, вы могли бы немного расширить свой вопрос, и я либо отвечу на него, либо наложим на него щедрость, и кто-то будет рядом с конкретными примерами Ninject.Moq (если это что вы ищете) –

+0

Я отредактировал оригинальное сообщение, чтобы более подробно рассказать о своей проблеме в настоящее время. Тем временем, я также опубликовал тот же вопрос о группах Ninject. Если я получу там ответ, я тоже опубликую его здесь. –

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