使用依赖注入时更改用于单元测试的虚假存储库

时间:2011-09-30 14:07:06

标签: unit-testing dependency-injection

在我的程序中,我的情况可以简化为以下内容:

  • 我创建MemoryRepository和SqlRepository实现的IRepository
  • 一个获取IRepository构造函数的Mapper。
  • 包含我想要测试的业务逻辑的Mapper.Map()

我创建了一个Mapper接收MemoryRepository的测试。 通过在将在业务逻辑中使用的内存存储库中显式设置属性,我现在可以测试此逻辑。 但是,如果我使用注入,我将无法访问此存储库。

一些代码告诉你超过1000个普通单词here is the pastebin link

你会怎么做?

2 个答案:

答案 0 :(得分:1)

不完全确定你在这里问的是,你在测试映射器还是存储库?如果您正在测试映射器,那么伪造存储库。你已经有了接缝,要么在你的测试中使用一个框架或者手动创建一个虚假的存储库,为了测试Mapper而产生你想要的任何快乐噪声,并通过将你的虚假传入构造函数来创建映射器。 / p>

所以通过自己的简化,

  • 创建一个从IRepository继承的虚假存储库
  • 将假冒伪劣注入您要测试的Mapper
  • 测试Mapper.Map()

如果您需要验证存储库中的某些信息,请使用模拟而不是存根。

Difference Between Mocks and Stubs

答案 1 :(得分:1)

如果我理解你的问题,基本上你担心你的存储库是在实例化测试类时创建和注入的,所以在你的测试方法中,你不能修改存储库的状态,因为它已经在你的映射器中,并且当然,您的映射器不应该暴露存储库的内部。

如果是这种情况,那么我认为你不必担心,只需修改myMemoryCategoryRepository的状态并执行mapper的方法。您的映射器应该相应地运行,因为您注入的是对存储库的引用,因此映射器内的对象与您要修改的对象相同。

Dim myMemoryCategoryRepository As MemoryCategoryRepository = MemoryKernel.Instance.Get(Of MemoryCategoryRepository)()
Dim myCategoryMapper As CategoryMapper = New CategoryMapper(myMemoryCategoryRepository)

<TestMethod()> _
    Public Sub GetCategoryStartDate_CategoryStartDateAndContractStartDate_ContractStartDateIsOldestDate()

   myMemoryCategoryRepository.AnyFlag = True
   myCategoryMapper.Execute()
   Assert.AreEqual(expectedValue, myCategoryMapper.Value)
End Sub