NSubstitute:模拟与没有相应setter的成员变量关联的合成吸糖方法时遇到麻烦



对于我的 .NET C# 应用程序,我使用的是名为 efaxdeveloper.com 的第三方电子邮件传真软件

我需要模拟efaxdeveloper.com的软件OutboundResponse对象。

请记住,由于它是第 3 方,我显然无法修改第 3 方 dll。

在 eFaxDeveloper.dll 中,下面是 OutboundResponse 类的代码:

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 类创建接口,所以有人可以告诉我如何使用 NSubstitute 模拟所述对象并使其返回正确的值吗?

NSubstitute 不能模拟这种类型,因为它没有virtual成员。(出于同样的原因,我们也不能手动创建覆盖 getter 并公开 setter 并将其用于测试的子类型的OutboundResponse

通过创建一个接口来封装来自第三方库(外观模式)的所有所需行为并测试代码与该接口的交互,您可能会更轻松地工作。然后,您可以单独测试该接口的实现,在调用第三方库时生成正确的结果。这些可能是集成测试或手动测试。

<shamelessplug>我之前写过一些关于我们不拥有的模拟类型的缺点的文章,你可能会觉得有用。</shamelessplug>

最新更新