我有这个 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 拦截那个 getter,或者我如何在它尝试评估它之前设置 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 google 代码问题:
关于c# - 如何让NBuilder在生成对象时拦截getter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11130781/