.net NSubstitute对象可以';t使用Returns()扩展方法

.net NSubstitute对象可以';t使用Returns()扩展方法,.net,vb.net,nunit,nsubstitute,.net,Vb.net,Nunit,Nsubstitute,我在我们公司做VB项目。它相当古老,但正在积极开发中。最近我们引入了单元测试,新特性必须被涵盖,如果我们有空闲时间,我们也会选择一些旧特性。我们正在使用NUnit3.9和NSubstitute2.0.3,测试项目目标是.NETFramework 3.5 更新:正如Lasse Vågsæther Karlsen建议的那样,我为这个问题准备了MCV,下面是失败的代码: Dim dataReaderSubstitute As IDataReader = Substitute.For(Of IDataR

我在我们公司做VB项目。它相当古老,但正在积极开发中。最近我们引入了单元测试,新特性必须被涵盖,如果我们有空闲时间,我们也会选择一些旧特性。我们正在使用NUnit3.9和NSubstitute2.0.3,测试项目目标是.NETFramework 3.5

更新:正如Lasse Vågsæther Karlsen建议的那样,我为这个问题准备了MCV,下面是失败的代码:

Dim dataReaderSubstitute As IDataReader = Substitute.For(Of IDataReader)()
dataReaderSubstitute.GetValue(0).Returns(email) 'test fails here
为了确保最新版本的NSubstitute中仍然存在这个问题,并且可以快速复制,我在.NET4.6.2中使用NUnit3.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
导入NUnit.Framework
进口替代品
公共类替换问题测试
私有共享只读迭代器属性PersonTestData()为IEnumerable(属于TestCaseData)
得到
产生新的TestCaseData(“john。smith@domain.com")
结束
端属性
公共子替换问题(ByVal电子邮件作为字符串)
Dim DataReader替换为IDataReader=替换为(IDataReader的)()
dataReaderSubstitute.GetValue(0)。返回(电子邮件)'测试在此失败
端接头
末级
问题是,我在
SubstituteProblem
方法的第二行中得到一个错误:

测试名称:替换问题(“john。smith@domain.com”)
测试全名:NSSubstituteTest.SubstituteProblemTest.SubstituteProblem(“约翰。smith@domain.com”)
测试源:c:\git\NSubstituteTest\NSubstituteTest\SubstituteProblemTest.vb:第12行
测试结果:失败
测试持续时间:0:00:00.368

结果消息:System.NullReferenceException:对象变量或未设置块变量
结果堆栈跟踪:
在Microsoft.VisualBasic.CompilerServices.Symbols.Container..ctor(对象实例)
在Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateCall(对象实例、类型类型、字符串成员名、对象[]参数、字符串[]参数名、类型[]类型参数、布尔[]回写、布尔IgnoreReturn)
在c:\git\NSubstituteTest\NSubstituteTest\SubstituteProblemTest.vb中的NSubstituteTest.SubstituteProblemTest.SubstituteProblemTest(字符串名)中


我不确定我做错了什么,我是按照NSubstitute网站上的例子做的。为什么Returns方法无法更改NSSubstitute创建的对象?

看起来这是我的错误。我不知道所谓的“后期绑定”,这是VisualBasic语言的一个特性。当我试图在类型为
对象的实例上使用
Returns
方法时,编译器试图执行该方法,就好像它是类的一部分,而不是扩展。所以我必须显式地执行扩展方法:

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

\u databaseCommandFactorySubstitute
的类型是什么?你能把它添加到问题中吗?你是否配置了
\u databaseCommandFactorySubstitute.Create()
应该返回什么?@LasseVågsætherKarlsen
\u databaseCommandFactorySubstitute.Create()
返回继承IDatabaseCommand的NSubstitute代理,这是我所期望的。问题出现在前面几行:
dataReaderSubstitute.GetValue(0).Returns(电子邮件)
您可能需要将其缩小到一个范围,我在这里做的一个简单测试在替换GetValue返回值方面没有问题,尽管这是一个非常旧的NSubstitute版本。@LasseVågsætherKarlse我稍微改变了我的问题,如果清楚了就告诉我