NSubstitute对象不能使用Returns()扩展方法

时间:2018-02-14 17:34:08

标签: .net vb.net nunit nsubstitute

我正在公司的VB项目上工作。这是相当古老的,但正在积极发展。最近我们介绍了单元测试,必须涵盖新功能,如果我们有空闲时间,我们也会选择一些旧功能。我们正在使用NUnit 3.9和NSubstitute 2.0.3,测试项目目标是.NET Framework 3.5。

更新:正如LasseVågsætherKarlsen建议的那样,我为这个问题准备了MCV,这里的代码失败了:

Dim dataReaderSubstitute As IDataReader = Substitute.For(Of IDataReader)()
dataReaderSubstitute.GetValue(0).Returns(email) 'test fails here

为了确保NSubstitute的最新版本中仍然存在问题并且可以快速复制,我在.net 4.6.2中使用NUnit 3.9.0和NSubstitute 3.1.0创建了单独的项目

Imports NUnit.Framework
Imports NSubstitute

<TestFixture> Public Class SubstituteProblemTest

Private Shared ReadOnly Iterator Property PersonTestData() As IEnumerable(Of TestCaseData)
    Get
        Yield New TestCaseData("john.smith@domain.com")
    End Get
End Property

<Test, TestCaseSource("PersonTestData")> Public Sub SubstituteProblem(ByVal email As String)
    Dim dataReaderSubstitute As IDataReader = Substitute.For(Of IDataReader)()
    dataReaderSubstitute.GetValue(0).Returns(email) 'test fails here
End Sub

End Class

问题是我在SubstituteProblem方法的第二行收到错误:

  

测试名称:SubstituteProblem(“john.smith@domain.com”)
  测试FullName:NSubstituteTest.SubstituteProblemTest.SubstituteProblem(“john.smith@domain.com”)
  测试源:c:\ git \ NSubstituteTest \ NSubstituteTest \ SubstituteProblemTest.vb:第12行
  测试结果:失败   测试时间:0:00:00.368

     

结果消息:System.NullReferenceException:未设置对象变量或With块变量。
  结果StackTrace:
  在Microsoft.VisualBasic.CompilerServices.Symbols.Container..ctor(Object Instance)
     at Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateCall(Object Instance,Type Type,String MemberName,Object [] Arguments,String [] ArgumentNames,Type [] TypeArguments,Boolean [] CopyBack,Boolean IgnoreReturn)
     at NSubstituteTest.SubstituteProblemTest.SubstituteProblem(String forename)在c:\ git \ NSubstituteTest \ NSubstituteTest \ SubstituteProblemTest.vb:第14行

我不确定我做错了什么,我是在关注NSubstitute网站https://nsubstitute.github.io/help/set-return-value/的例子。为什么Returns方法不能改变NSubstitute创建的对象?

1 个答案:

答案 0 :(得分:1)

看起来这是我的错误。我不知道一些叫做“Late Binding”的东西,它是Visual Basic语言的一个特性。当我尝试在类型Returns的实例上使用Object方法时,编译器尝试执行方法,就好像它是类的一部分,而不是扩展。所以我必须明确地执行扩展方法:

Dim dataReaderSubstitute As IDataReader = Substitute.For(Of IDataReader)()
SubstituteExtensions.Returns(dataReaderSubstitute.GetValue(0), email)