NSubstitute:无法模拟与没有对应 setter 的成员变量关联的语法糖 getter 方法
NSubstitute: Trouble mocking a syntatic sugar getter method associated with a member variable with No corresponding setter
对于我的 .NET C# 应用程序,我正在使用名为 efaxdeveloper.com
的第三方电子传真软件
我需要模拟 efaxdeveloper.com 的软件 OutboundResponse 对象。
请记住,因为它是第 3 方,我显然不能修改第 3 方 dll。
在eFaxDeveloper.dll中,以下是OutboundResponse的代码class:
using System.Runtime.InteropServices;
namespace J2.eFaxDeveloper.Outbound
{
//
// Summary:
// oubound response
[ClassInterface(ClassInterfaceType.AutoDual)]
[System.Runtime.Serialization.DataContractAttribute(Namespace = "")]
public class OutboundResponse
{
public OutboundResponse();
//
// Summary:
// Unique client specified transmission identifier
public string TransmissionID { get; }
//
// Summary:
// eFax Developer™ transmission identifier
public string DOCID { get; }
//
// Summary:
// J2.eFaxDeveloper.Outbound.StatusCode
public StatusCode StatusCode { get; }
//
// Summary:
// Status description
public string StatusDescription { get; }
//
// Summary:
// J2.eFaxDeveloper.Outbound.ErrorLevel
public ErrorLevel ErrorLevel { get; }
//
// Summary:
// Error message
public string ErrorMessage { get; }
}
}
因为它只有 getter,所以我尝试了以下代码片段:
OutboundResponse outboundResponseInQuestion = Substitute.For<OutboundResponse>();
outboundResponseInQuestion.TransmissionID.Returns("someTransmissionID");
不幸的是,outboundResponseInQuestion.TransmissionID 抛出
'outboundResponseInQuestion.TransmissionID' 引发了 'System.NullReferenceException'
类型的异常
我无法为 OutboundResponse 创建接口 class 所以有人可以告诉我如何使用 NSubstitute 模拟所述对象并使其 return 成为正确的值吗?
NSubstitute 无法模拟此类型,因为它没有 virtual
成员。 (出于同样的原因,我们也无法手动创建 OutboundResponse
的子类型来覆盖 getter 并公开 setter 并将其用于测试。)
通过创建一个封装来自第 3 方库 (facade pattern) 的全部所需行为的接口并测试您的代码与该接口的交互,您可能会更轻松。然后,您可以单独测试该接口的实现在调用第 3 方库时产生正确的结果。这些可能是集成或手动测试。
<shamelessplug>
我之前写了一些关于 downsides of mocking types we don't own 的文章,您可能会觉得有用。</shamelessplug>
对于我的 .NET C# 应用程序,我正在使用名为 efaxdeveloper.com
的第三方电子传真软件我需要模拟 efaxdeveloper.com 的软件 OutboundResponse 对象。
请记住,因为它是第 3 方,我显然不能修改第 3 方 dll。
在eFaxDeveloper.dll中,以下是OutboundResponse的代码class:
using System.Runtime.InteropServices;
namespace J2.eFaxDeveloper.Outbound
{
//
// Summary:
// oubound response
[ClassInterface(ClassInterfaceType.AutoDual)]
[System.Runtime.Serialization.DataContractAttribute(Namespace = "")]
public class OutboundResponse
{
public OutboundResponse();
//
// Summary:
// Unique client specified transmission identifier
public string TransmissionID { get; }
//
// Summary:
// eFax Developer™ transmission identifier
public string DOCID { get; }
//
// Summary:
// J2.eFaxDeveloper.Outbound.StatusCode
public StatusCode StatusCode { get; }
//
// Summary:
// Status description
public string StatusDescription { get; }
//
// Summary:
// J2.eFaxDeveloper.Outbound.ErrorLevel
public ErrorLevel ErrorLevel { get; }
//
// Summary:
// Error message
public string ErrorMessage { get; }
}
}
因为它只有 getter,所以我尝试了以下代码片段:
OutboundResponse outboundResponseInQuestion = Substitute.For<OutboundResponse>();
outboundResponseInQuestion.TransmissionID.Returns("someTransmissionID");
不幸的是,outboundResponseInQuestion.TransmissionID 抛出
'outboundResponseInQuestion.TransmissionID' 引发了 'System.NullReferenceException'
类型的异常我无法为 OutboundResponse 创建接口 class 所以有人可以告诉我如何使用 NSubstitute 模拟所述对象并使其 return 成为正确的值吗?
NSubstitute 无法模拟此类型,因为它没有 virtual
成员。 (出于同样的原因,我们也无法手动创建 OutboundResponse
的子类型来覆盖 getter 并公开 setter 并将其用于测试。)
通过创建一个封装来自第 3 方库 (facade pattern) 的全部所需行为的接口并测试您的代码与该接口的交互,您可能会更轻松。然后,您可以单独测试该接口的实现在调用第 3 方库时产生正确的结果。这些可能是集成或手动测试。
<shamelessplug>
我之前写了一些关于 downsides of mocking types we don't own 的文章,您可能会觉得有用。</shamelessplug>