对于我的.NET C#应用程序,我正在使用名为efaxdeveloper.com的第三方电子传真软件
我需要模拟efaxdeveloper.com的软件OutboundResponse对象。
请记住,由于它是第三方,因此我显然不能修改第三方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; }
}
}
由于它只有 setter/getter ,因此我尝试了以下代码片段:
OutboundResponse outboundResponseInQuestion = Substitute.For<OutboundResponse>();
outboundResponseInQuestion.TransmissionID.Returns("someTransmissionID");
不幸的是,outboundResponseInQuestion.TransmissionID抛出
'outboundResponseInQuestion.TransmissionID'引发了类型'System.NullReferenceException'的异常
我无法为OutboundResponse类创建接口(interface),所以有人可以告诉我如何使用NSubstitute模拟所说的对象并使其返回正确的值吗?
最佳答案
NSubstitute无法模拟此类型,因为它没有virtual
成员。 (出于同样的原因,我们也不能手动创建OutboundResponse
的子类型来覆盖getter和暴露setter并将其用于测试。)
通过创建一个封装第三方库(facade pattern)所需行为的整体的接口(interface),并测试代码与该接口(interface)的交互,您可能会更轻松一些。然后,您可以在调用第三方库时单独测试该接口(interface)的实现是否产生正确的结果。这些可以是集成测试或手动测试。<shamelessplug>
我之前已经写了一些有关downsides of mocking types we don't own的文章,您可能会觉得有用。 </shamelessplug>
关于unit-testing - NSubstitute:无法模拟与成员变量关联的语法糖 getter 方法,没有相应的 setter ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55054764/