c# - 如何让NBuilder在生成对象时拦截getter?

标签 c# nbuilder

我有这个 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 代码问题:

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

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

相关文章:

c# - WPF:ListView 和编辑 ListViewItem

c# - 缓慢的 AD 组成员查找

c# - 画一个圆的边界?

c# - 如何使用将验证考虑在内的构建器自动创建测试数据

c# - 有没有办法用测试数据创建一个类型的实例?

c# - 如何使用最小起订量模拟私有(private)只读 IList<T> 属性

c# - 如何在 C# 中最小化 protected 属性

c# - 加载多个数据时 WCF 服务 channel 中的 CommunicationObjectAbortedException

c# - 处理来自外部系统的结果代码查找——如果需要则抛出异常

c# - nBuilder 仅填充值类型