Moq:模拟控制器的抽象基础 class 的接口
Moq: Mocking an interface of abstract base class of a controller
我的问题:
我想对控制器进行单元测试。该控制器有一个包含存储库的构造函数。存储库的名称类似于 SomethingRepository
。 SomethingRepository
继承自抽象 class BaseRepository<ReadModel, Dto, Filter>
。 BaseRepository
继承自接口 IRepository<ReadModel, Dto, Filter>
.
当我想使用 Moq 模拟 SomethingRepository
时,我将需要模拟接口,据我所知,因为模拟 class 将需要一个空构造函数 SomethingRepository
和 BaseRepository
没有。 (我不想加一个)
所以,我试过了
Mock.Of<
IRepository<
SomeReadModel,
SomeDto,
SomeFilter>
>();
但是,当我尝试将此模拟(使用强制转换)分配给 SomethingRepository
类型的变量时,我得到一个 InvalidCastException
:
System.InvalidCastException : Unable to cast object of type 'Castle.Proxies.IRepository`3Proxy' to type 'Repositories.SomeRepository'.
我该如何解决这个问题?
每个 SomeRepository
都是 IRepository<SomeReadModel, SomeDto, SomeFilter>
,但并非每个 IRepository<SomeReadModel, SomeDto, SomeFilter>
都是 SomeRepository
。如果您的控制器注入了 SomeRepository
,您必须提供(或继承自)SomeRepository
class.
的内容
解决方案是更改您的控制器,使其注入 IRepository<SomeReadModel, SomeDto, SomeFilter>
。
SomeController
的构造函数具有以下接受 IRepository
的签名:
public SomeController(IRepository<ReadModel, Dto, Filter> repository)
: base(repository)
在我的测试中,我试图将其转换为具体的存储库:
SomeRepository repository = (SomeRepository) Mock.of<IRepository<ReadModel, Dto, Filter>>;
new SomeController(repository);
相反,我需要将存储库接口传递给控制器,而不是具体的 class:
IRepository<Something> repository = Mock.of<IRepository<ReadModel, Dto, Filter>>;
new SomeController(repository);
我的问题:
我想对控制器进行单元测试。该控制器有一个包含存储库的构造函数。存储库的名称类似于 SomethingRepository
。 SomethingRepository
继承自抽象 class BaseRepository<ReadModel, Dto, Filter>
。 BaseRepository
继承自接口 IRepository<ReadModel, Dto, Filter>
.
当我想使用 Moq 模拟 SomethingRepository
时,我将需要模拟接口,据我所知,因为模拟 class 将需要一个空构造函数 SomethingRepository
和 BaseRepository
没有。 (我不想加一个)
所以,我试过了
Mock.Of<
IRepository<
SomeReadModel,
SomeDto,
SomeFilter>
>();
但是,当我尝试将此模拟(使用强制转换)分配给 SomethingRepository
类型的变量时,我得到一个 InvalidCastException
:
System.InvalidCastException : Unable to cast object of type 'Castle.Proxies.IRepository`3Proxy' to type 'Repositories.SomeRepository'.
我该如何解决这个问题?
每个 SomeRepository
都是 IRepository<SomeReadModel, SomeDto, SomeFilter>
,但并非每个 IRepository<SomeReadModel, SomeDto, SomeFilter>
都是 SomeRepository
。如果您的控制器注入了 SomeRepository
,您必须提供(或继承自)SomeRepository
class.
解决方案是更改您的控制器,使其注入 IRepository<SomeReadModel, SomeDto, SomeFilter>
。
SomeController
的构造函数具有以下接受 IRepository
的签名:
public SomeController(IRepository<ReadModel, Dto, Filter> repository)
: base(repository)
在我的测试中,我试图将其转换为具体的存储库:
SomeRepository repository = (SomeRepository) Mock.of<IRepository<ReadModel, Dto, Filter>>;
new SomeController(repository);
相反,我需要将存储库接口传递给控制器,而不是具体的 class:
IRepository<Something> repository = Mock.of<IRepository<ReadModel, Dto, Filter>>;
new SomeController(repository);