2013-07-02 2 views
3

У меня, кажется, проблема, у меня есть класс (LoginService), который принимает в конструкторе IUser. Это делается для проведения интеграционных тестов, а не модульных тестов, поэтому я не хочу их устанавливать, у меня уже есть несколько тестов модулей, и они отлично работают с помощью Moq с креплением.AutoFixture: невозможно создать экземпляр, возможно, нет открытого конструктора

настроить мой светильник: -

var fixture = new Fixture(); 

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

var user = fixture.Freeze<IUser>(); 

Так мне удалось заставить его работать, выполнив следующие действия

IUser user = new User(); // Create my IUser manually 
    fixture.Inject(user); 

, а затем, наконец, создать тестируемой и достаточно уверенный экземпляр впрыскивается.

var sut = fixture.Create<LoginService>(); 

Я делаю это правильно? Могу ли я использовать Freeze, и я должен продолжать создавать свой IUser вручную и вводить его на прибор?

Посмотрите вперед к какой-либо помощи или информации

+0

Конечно, я мог бы взять autofixture из уравнения, но я думаю, он пригодится даже тогда, когда не издевается, т. е. я могу сделать var user = new User(); var sut = new LoginService (пользователь); – Martin

ответ

4

Да, это правильно - Если вы хотите поставить конкретный экземпляр IUser к LoginService вы должны вводить его.

Просто имейте в виду, что Inject повлияет на все последующие запросы (если есть) для IUser.

+0

ах ок, значит, я всегда получаю этот экземпляр? Так это правильный способ сделать это? – Martin

+0

* Технически * что вы делаете правильно :) –

+0

Спасибо за подтверждение – Martin

3

Ответ от Nikos Baxevanis правильный, но есть много способов кожи этого кота.

Если вместо одного и того же экземпляра пользователя, вы хотите новый экземпляра каждый раз, вы можете также отобразить User в IUser:

fixture.Customizations.Add(
    new TypeRelay(
     typeof(IUser), 
     typeof(User))); 
+0

Отлично! спасибо, стоит отметить – Martin

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