2013-07-02 56 views
3

我似乎有问题,我有一个类(LoginService),它在构造函数中接受一个I​​User。这是为了执行集成测试而不是单元测试,因此我不想MOCK这些,我已经进行了一些单元测试,并且他们使用Moq与夹具一起工作得很好。AutoFixture:无法创建一个实例,可能没有公共构造函数

设置我的灯具: -

var fixture = new Fixture(); 

然后,我希望能够冻结一个版本的IUSER的,我曾尝试以下,但我无法得到它的工作,它抱怨说,它不能创建实例,可能是由于没有构造函数。

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

所以我设法得到它的工作做了以下

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

,最后创建SUT果然实例被注入。

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

所以我这样做是正确的吗?我不能使用Freeze,我应该继续手动创建我的IUser并将其注入到夹具中?

期待任何帮助或信息

+0

我当然可以采取autofixture的方程,但我认为它即使不嘲笑也派上用场,即我可以做var user = new User(); var sut = new LoginService(user); – Martin

回答

4

是的,这是正确的 - 如果你要提供的IUser一个具体的例子,你必须注入它的LoginService

请记住,Inject将影响IUser的所有后续请求(如果有)。

+0

好的,所以我会永远得到那个实例?那么这是做到这一点的正确方法? – Martin

+0

*技术上*你在做什么是正确的:) –

+0

感谢您的确认 – Martin

3

尼科斯Baxevanis的答案是正确的,但有很多方法来皮肤那只猫。

如果不是同一个用户实例,你想有一个例如每一次,你还可以映射UserIUser

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

太棒了!谢谢,值得注意的是 – Martin

相关问题