2015-06-16 3 views
2

Как получить вокруг сценария, где TestFixture вы пытаетесь определить потребности ссылаться на типах, которые не имеют конструктора без аргументов?NUnit TestFixture с без аргументов конструкторов

Я пытаюсь проверить интерфейс, который имеет несколько реализаций. Из документации NUnit он показал, как это может быть установка с дженериков, как это (где я могу определить несколько типов реализации):

[TestFixture(typeof(Impl1MyInterface))] 
[TestFixture(typeof(Impl2MyInterface))] 
[TestFixture(typeof(Impl3MyInterface))] 
public class TesterOfIMyInterface<T> where T : IMyInterface, new() { 

    public IMyInterface _impl; 

    [SetUp] 
    public void CreateIMyInterfaceImpl() { 
     _impl = new T(); 
    } 
} 

Проблема возникает потому, что Impl1MyInterface, Impl2MyInterface и т.д. не имеют без аргументов конструктора так, когда NUnit пытается обнаружить доступные тестовые случаи, которые я получаю эту ошибку (и тесты не показывают в VS):

Exception System.ArgumentException, исключение брошено обнаружения тестов в XYZ.dll

Есть ли способ обойти это? Не имеет смысла определять конструкторы no-arg, потому что мой код нуждается в этих значениях для работы.

ответ

0

Вместо того, чтобы использовать new T() для создания объектов, вы можете использовать dependency injection container, чтобы создать их для вас. Вот пример использования Unity от Microsoft:

[SetUp] 
public void CreateIMyInterfaceImpl() { 
    var container = new UnityContainer(); 

    // Register the Types that implement the interfaces needed by 
    // the Type we're testing. 
    // Ideally for Unit Tests these should be Test Doubles. 
    container.RegisterType<IDependencyOne, DependencyOneStub>(); 
    container.RegisterType<IDependencyTwo, DependencyTwoMock>(); 

    // Have Unity create an instance of T for us, using all 
    // the required dependencies we just registered 
    _impl = container.Resolve<T>(); 
} 
+0

-Это фактически не _impl = new T(); это проблема, скорее, это атрибут typeof на TestFixture, который вызывает проблему. – snappymcsnap

+0

Вы пытались удалить новое() общее ограничение, а также вызов new()? т. е. где T: IMyInterface {... –

0

Как @Steve Lillis сказал в своем ответе, вы должны прекратить использовать new T(). Когда вы это сделаете, вам не нужно использовать ограничение new на ваш общий. Один из вариантов - использовать контейнер IOC, например Castle Windsor/Unity, поскольку Стив предложил разрешить зависимости в вашей программе установки.

Вы не указали, какие параметры выполняются конструкторами вашей реализации, но если они все одинаковые, вместо этого вместо этого следует использовать Activator.CreateInstance. Итак, если ваши конструкторы взяли целое число и строку, ваш код будет выглядеть так:

[TestFixture(typeof(Impl1MyInterface))] 
[TestFixture(typeof(Impl2MyInterface))] 
[TestFixture(typeof(Impl3MyInterface))] 
public class TesterOfIMyInterface<T> where T : IMyInterface { 

    public IMyInterface _impl; 

    [SetUp] 
    public void CreateIMyInterfaceImpl() { 
     int someInt1 = 5; 
     string someString = "some value"; 
     _impl = (T)Activator.CreateInstance(typeof(T), new object[] { someInt1, someString }); 
    } 
} 
Смежные вопросы