[英]Moq: Mocking an interface of abstract base class of a controller
我的问题:我想对 controller 进行单元测试。这个 controller 有一个包含存储库的构造函数。 存储库的名称类似于SomethingRepository
。 SomethingRepository
继承自抽象 class BaseRepository<ReadModel, Dto, Filter>
。 BaseRepository
继承自接口IRepository<ReadModel, Dto, Filter>
。
当我想使用 Moq 模拟SomethingRepository
时,我需要模拟接口,据我所知,因为 mocking 和 class 将需要一个SomethingRepository
和BaseRepository
没有的空构造函数。 (我不想加一个)
所以,我试过了
Mock.Of<
IRepository<
SomeReadModel,
SomeDto,
SomeFilter>
>();
但是,当我尝试将此模拟(带有强制转换)分配给SomethingRepository
类型的变量时,我得到一个InvalidCastException
:
System.InvalidCastException:无法将类型为“Castle.Proxies.IRepository`3Proxy”的 object 转换为类型“Repositories.SomeRepository”。
我该如何解决?
每个SomeRepository
都是IRepository<SomeReadModel, SomeDto, SomeFilter>
,但不是每个IRepository<SomeReadModel, SomeDto, SomeFilter>
都是SomeRepository
。 如果你的 controller 注入了一个SomeRepository
,你必须提供一些是(或继承自) SomeRepository
class 的东西。
解决方案是更改您的 controller 以便它注入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);
相反,我需要将存储库接口传递到 controller,而不是具体的 class:
IRepository<Something> repository = Mock.of<IRepository<ReadModel, Dto, Filter>>;
new SomeController(repository);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.