模拟界面转回原始类

时间:2017-01-13 17:24:22

标签: c# unit-testing moq

我的MongoDbRepository有一个名为IRepository的界面。所以我在嘲笑设置UpdateOneAsync方法的界面。但是我的MerchantConfigurationRepository只能使用MongoDbRepository对象,这就是我需要投射它的原因。出于某种原因,当我这样做时

(MongoDBRepository<MerchantConfigurationEntity>)dataAccess.Object

我收到错误

  

无法将'Castle.Proxies.IRepository`1Proxy'类型的对象转换为   输入'Newgistics.Common.MongoDb.MongoDBRepository`1

我应该如何设置Mock然后传入对象,我尝试将变量设置为dataAccess.Object并传入该变量,但如果我这样做,则设置为{{1 }}。

您将在下面找到单元测试:

null

1 个答案:

答案 0 :(得分:1)

由于这个原因,你的课程应该依赖于抽象而不是结果。 MerchantConfigurationRepository应该依赖IRepository<MerchantConfigurationEntity>而不是实施MongoDBRepository<MerchantConfigurationEntity>

public class MerchantConfigurationRepository {
    private readonly IRepository<MerchantConfigurationEntity> repository;

    public MerchantConfigurationRepository(IRepository<MerchantConfigurationEntity> repositiry) {
        this.repository = repository;
    }

    //...other code

    public Task<int> UpdateMerchant(Merchant model) { ... }
}

现在,您可以更灵活地在单独测试时使用模拟的存储库。

var merchantRepo = new MerchantConfigurationRepository(dataAccess.Object);

确保你的DI知道在生产中使用实际的实现。