我的問題:我想對控制器進行單元測驗。這個控制器有一個包含存盤庫的建構式。存盤庫命名為SomethingRepository. SomethingRepository繼承自抽象類BaseRepository<ReadModel, Dto, Filter>。BaseRepository繼承自 interface IRepository<ReadModel, Dto, Filter>。
當我想SomethingRepository使用 Moq 進行模擬時,據我所知,我需要模擬介面,因為模擬一個類將需要一個空的建構式,SomethingRepository并且BaseRepository沒有。(我不想加一個)
所以,我試過了
Mock.Of<
IRepository<
SomeReadModel,
SomeDto,
SomeFilter>
>();
但是,當我嘗試將此模擬(使用強制轉換)分配給型別為 的變數時SomethingRepository,我得到一個InvalidCastException:
System.InvalidCastException:無法將“Castle.Proxies.IRepository`3Proxy”型別的物件轉換為“Repositories.SomeRepository”型別。
我該如何解決?
uj5u.com熱心網友回復:
每個SomeRepository都是一個IRepository<SomeReadModel, SomeDto, SomeFilter>,但不是每個IRepository<SomeReadModel, SomeDto, SomeFilter>都是一個SomeRepository。如果您的控制器注入了 a SomeRepository,則您必須提供屬于(或繼承自)SomeRepository該類的內容。
解決方案是更改您的控制器,使其注入 aIRepository<SomeReadModel, SomeDto, SomeFilter>代替。
uj5u.com熱心網友回復:
的建構式SomeController具有以下簽名,它接受一個IRepository:
public SomeController(IRepository<ReadModel, Dto, Filter> repository)
: base(repository)
在我的測驗中,我試圖將其轉換為具體的存盤庫:
SomeRepository repository = (SomeRepository) Mock.of<IRepository<ReadModel, Dto, Filter>>;
new SomeController(repository);
相反,我需要將存盤庫介面傳遞給控制器??,而不是具體的類:
IRepository<Something> repository = Mock.of<IRepository<ReadModel, Dto, Filter>>;
new SomeController(repository);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/314620.html
上一篇:繼承類看不到基類
