我有以下NBuilder代码:

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


很死很简单。

但这在Review的此属性上是错误的:

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拦截该吸气剂,或者如何在尝试评估用户属性之前设置User属性? (因此可以防止错误)。

最佳答案

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

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

因此,基本上,您可能会采用以下两种方法:

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谷歌代码问题,涉及以下问题:

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

关于c# - 生成对象时如何告诉NBuilder拦截 setter/getter ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11130781/

10-17 02:11