c# - 我如何对仅由 NHibernate 设置的 protected 属性进行单元测试?

标签 c# unit-testing nhibernate nunit moq

我正在使用 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/

相关文章:

python - 如何在 Python 单元测试中模拟 __version__

c# - 实现 IDispatch::Invoke 以供 WebBrowser 控件调用

c# - c# 中的类,它提供有关机器的信息

javascript - jasmine需要sinon.js吗?

python - 在模拟中修补生成器

c# - 在 Fluent NHibernate 中处理与值类型的一对多关系

c# - NHibernate - 存储过程是立即执行还是仅在提交时执行?

c# - 在 NHibernate 中获取正确类型的代理

c# - 在 IIS8 中部署时缓存不起作用

c# - 如何禁用从一种类型的多个实例订阅事件并只允许一个?