AutoFixture:无法创建实例,可能没有公共构造函数

问题描述 投票:0回答:2

我有一个类(LoginService),它在构造函数中接受 IUser。这是为了执行集成测试而不是单元测试,因此我不想模拟这些,我已经有了一些单元测试,并且它们使用带有固定装置的 Moq 工作得很好。

我设置了我的装置:

  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 并将其注入到夹具上吗?

c# autofixture
2个回答
4
投票

是的,这是正确的 – 如果您想向

IUser
提供
LoginService
的特定实例,您必须注入它。

请记住,

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


3
投票

Nikos Baxevanis 的答案是正确的,但是有很多方法可以剥那只猫的皮。

如果您每次都想要一个 new 实例,而不是相同的用户实例,您也可以将

User
映射到
IUser

fixture.Customizations.Add(
    new TypeRelay(
        typeof(IUser),
        typeof(User)));
© www.soinside.com 2019 - 2024. All rights reserved.