2015-03-05 5 views
2

Я хотел бы создать настройку, которая настраивает AutoFixture для передачи типов, которые у нее есть для реализации вместо Moq. Как я могу сделать это в целом?принудительное реле для насмешливого каркаса

Чтобы уточнить, считают:

public class test 
    { 
     public string foo; 
     public test(IDictionary<string, string> stuffing) 
     { 
      foo = stuffing["bogus"]; 
     } 
    } 

    [TestMethod] 
    public void testInjection() 
    { 
     var fixture = new Fixture(); 
     bool didThrow; 
     try 
     { 
      var sut = fixture.Create<test>(); 
      didThrow = false; 
     } 
     catch 
     { 
      didThrow = true; 
     } 
     Assert.IsTrue(didThrow); 
    } 

тест проходит. AutoFixture предоставила мне фиктивную коллекцию, совместимую с IDictionary. Я бы хотел, чтобы тест потерпел неудачу ... в частности, я хотел бы передать IDictionary в Moq и получить то, что по умолчанию не жалуется на отсутствие ключей.

Я хотел бы использовать что-то наподобие fixture.UseAutoMoq().ForceRelay<Dictionary<string,string>>().

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

+0

Этот [ответ] (http://stackoverflow.com/a/20004789/467754) объясняет, как вы можете передавать конкретные типы в Moq при использовании AutoFixture. –

+0

Вышеприведенный тест проходит, потому что вокруг утверждения также есть блок «try» ... –

+0

@MarkSeemann да, в основном, этот тест проходит, потому что конкретный экземпляр словаря выдает исключение. Цель - IDictionary, который не бросает по какой-либо причине (пустой). – cocogorilla

ответ

3

Для того, чтобы сделать то, что вы просите, вы можете взять MockRelay добавил AutoMoqCustomization и переместить его перед известными-коллекции строителей:

[Fact] 
public void PassByMovingAutoMoqRelay() 
{ 
    var fixture = new Fixture().Customize(new AutoMoqCustomization()); 
    var relay = fixture.ResidueCollectors.OfType<MockRelay>().Single(); 
    fixture.Customizations.Add(relay); 

    var sut = fixture.Create<MyClass>(); // Doesn't throw 
} 

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

+0

Спасибо. Фактическая цель состоит в том, чтобы игнорировать IDictionary вообще ради других релевантных зависимостей, которые мне действительно нужны. Если этого не произойдет, я должен ввести пустую реализацию IDictionary вручную с помощью Inject (dummyDictionary). Это несколько строк «cruft», не связанных с SUT во многих тестах. Основная проблема заключается в том, что работа выполняется в конструкторе, относящемся к словарю (называемым ключами), который будет полностью реконструирован из конструктора SUT ... в конце концов. – cocogorilla

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