2

我有这个 NBuilder 代码:

var fakeReviews = Builder<Review>
   .CreateListOfSize(100)
   .Build()
   .ToList()
   .AsReadOnly();

非常简单。

但它在评论中的这个属性上出错了:

public bool WasWrittenByAdmin
{  
   get
   {
      if (User == null) throw new InvalidOperationException("Must load User.");
      return User.UserSettings != null && User.UserSettings.IsAdmin;
   }
}

基本上,我认为 NBuilder 正在尝试评估所有属性,包括 getter,但该 User 属性不存在。

即使我这样做:

var fakeReviews = Builder<Review>
   .CreateListOfSize(100)
   .All().With(x => x.User = Builder<User>.CreateNew().Build())
   .Build()
   .ToList()
   .AsReadOnly();

它仍然错误。

有什么方法可以告诉 NBuilder 拦截该 getter,或者在它尝试评估它之前如何设置 User 属性?(从而防止错误)。

4

1 回答 1

0

这并不理想,但我通过明确设置我不想要的属性的值来解决这个问题。

在您的情况下,这意味着要么根据您要测试的内容返回真/假,要么抛出异常。

所以基本上你可能会做两种这样的方法:

public static Review BuildReviewByAdmin() 
{
    return Builder<Review>.CreateNew().With(x => x.WasWrittenByAdmin = true).Build();
}

public static Review BuildReviewByNonAdmin() 
{
    return Builder<Review>.CreateNew().With(x => x.WasWrittenByAdmin = false).Build();
}

然后您可以在特定测试中使用您想要的那个。

但是,如果您要测试获取的逻辑,我会以不同的方式进行。

此外,还有一个涉及此问题的 NBuiler google 代码问题:

https://code.google.com/p/nbuilder/issues/detail?id=79

于 2015-03-11T12:17:23.550 回答