5

我有一个接口,它有像这样可以为空的参数

Result<Notice> List(int offset, int limit, Guid? publicationId, Guid? profileId, DateTime? toDate, ListingOrder order);

这就是我试图模拟这个方法的方式

mockNoticesClient.Setup(c => c.List(It.IsAny<int>(), It.IsAny<int>(), It.IsAny<Nullable<Guid>>(), It.IsAny<Nullable<Guid>>(), It.IsAny<Nullable<DateTime>>(), Data.Notices.ListingOrder.DateDesc)).Returns(dataNotices);

然后在尝试使用该方法时

var results = this.noticesClient.List(0, 100, null, profileId, latestNoticeTime, Data.Notices.ListingOrder.DateDesc);

每当此行运行时,尽管抛出此异常

... threw an exception of type 'System.NullReferenceException' ... {System.NullReferenceException}

我尝试了一些不同的组合,例如在参数中使用带有 null 的 setup ,但这也不起作用。我正在使用最新版本的 Moq 4.0.10827(目前)。

编辑: noticesClient 的构造函数采用 dataNoticesClient 的接口

public Client(Data.Notices.INotices noticesClient)

并像这样初始化

mockNoticesClient = new Mock<Data.Notices.INotices>();
noticesClient = new Client(mockNoticesClient.Object);

mockNoticesClient.Setup(c => c.List(It.IsAny<int>(), It.IsAny<int>(), It.IsAny<Nullable<Guid>>(), It.IsAny<Nullable<Guid>>(), It.IsAny<Nullable<DateTime>>(), It.IsAny<Data.Notices.ListingOrder>())).Returns(dataNotices);

mockNoticesClient.Setup(c => c.List(It.IsAny<int>(), It.IsAny<int>(), It.IsAny<Guid?>(), It.IsAny<Guid?>(), It.IsAny<DateTime?>(), It.IsAny<Data.Notices.ListingOrder>())).Returns(dataNotices);
4

2 回答 2

1

这是moq提出问题时库中的错误(moq 4.0.10827),但在这里解决了。现在可以使用 进行设置Nullable<T>和调用null,效果很好。

public interface INullable
{
    int Method(Guid? guid);
}

var mock = new Mock<INullable>();
mock.Setup(m => m.Method(It.IsAny<Guid?>())).Returns(6);
int a = mock.Object.Method(null); // a is 6
于 2019-03-26T21:32:40.620 回答
0

我将调试此测试并检查以下内容:

Data.Notices.ListingOrder.DateDesc

前三个值之一可能为空,因此NullReferenceException被抛出

顺便说一句,这种链接可能表明存在设计缺陷,请参阅得墨忒耳法则

于 2012-09-07T11:48:27.850 回答