Moq'ing参考变量

时间:2010-11-12 21:58:44

标签: vb.net unit-testing mocking moq

我们开始看到测试驱动开发的好处,并决定采取第一步让TDD推动我们的设计。 (AKA只是测试)然后希望一旦我们看到测试的好处以及可怜的嘲弄如何让我们设计得好,我们就会远离它们并重新考虑因素..无论如何,yada yada

我发现了一些类似的主题,但我无法真正建立起来。我有类似下面的内容:

<Test()>
  Public Sub TestMockWithReferenceVariable()
   Dim expected As New Dictionary(Of String, Object)
   expected.Add("test", 1)
   Dim pass As New Dictionary(Of String, Object)


   Dim mock = New Moq.Mock(Of ITestDM)()
   mock.Setup(Function(m) m.Load(Of String)("test", pass)).Returns("Test")

   Dim sing As New DMSinglton(mock.Object)
   Dim result As String = sing.Load(Of String)("test", pass)

   Assert.AreEqual("Test", result)
   Assert.AreEqual(expected, pass)
  End Sub



 Public Interface ITestDM
  Function Load(Of T)(ByVal sp As String, ByVal params As Dictionary(Of String, Object)) As T
 End Interface

有没有办法让我使用Moq将传入的字典更改为另一个字典,允许这些测试通过?

1 个答案:

答案 0 :(得分:0)

您可以使用单元测试框架中的collection suppoprt在MOQ之外执行此操作。我可以考虑使用MsTest或使用SequenseEquals Linq方法实现此目的的至少两种方法。

Dictionary<string, string> dict = new Dictionary<string, string> { { "test", "test" } };
Dictionary<string, string> dict2 = new Dictionary<string, string> { { "test", "test" } };
//MsTest CollectionAssert tests if two collections contain the same elements
CollectionAssert.AreEquivalent(dict, dict2);
//Another way to do the same thing - using SequenceEquals
Assert.IsTrue(dict.SequenceEqual(dict2));

假设字典中使用的引用类型覆盖Equals方法,这将起作用(值类型将只开箱即用)。