我正在使用 NHibernate 来持久化这个实体:
public class Store
{
public int Id { get; protected set; }
public int Name { get; set; }
}
请注意 Id
属性如何具有 protected setter 。这是为了防止用户更改 Id
,同时仍然允许 NHibernate 在将它保存到数据库时为其分配一个 Id
。
在我的一个单元测试中,我使用带有以下代码的 Moq 来模拟我的存储库:
var mock = new Mock<IRepository>();
mock.Setup(x => x.GetById<Store>(It.IsAny<int>()))
.Returns(new Store { Value = "Walmart" }); // can't set the ID here
var store = Repository.GetById<Store>(5);
Assert.That(store.Id == 5);
当我告诉 Moq 返回一个新的 Store
实例时,我无法分配 ID,单元测试失败。我如何对该属性进行单元测试?我不想更改该属性的访问级别,因为我不想让用户手动更改它,但这正是我必须在此处进行测试才能进行的操作。
最佳答案
只是将其作为另一种方法抛出,您可以使 setter protected internal
:
public class Store
{
public int Id { get; protected internal set; }
public int Name { get; set; }
}
并使用 InternalsVisibleTo
属性:
[assembly: InternalsVisibleTo("StoreUnitTests")]
关于c# - 我如何对仅由 NHibernate 设置的 protected 属性进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3784107/