c# - 对象的最小起订量设置属性
问题描述
我不得不使用一个具有未知依赖项并且可能有其他代码气味的类。
我无法更改此类及其在我不想接触的大量其他项目中的使用。
我创建了一个工厂来创建这个对象并设置属性。
我想要对这个工厂进行单元测试,并且由于这个对象未知的依赖关系,我正在使用 MOQ 创建一个模拟。
我有一个问题,我无法在 MOQ 对象上设置属性。我希望它由工厂设置而不是使用
mock.Setup(x => x.FirstName).Returns(firstName);
所以这是我的演示代码和测试
[TestCase("John")]
[TestCase("Paul")]
[TestCase("George")]
[TestCase("Ringo")]
public void Create(string firstName)
{
//arrange
var mock = new Mock<IPerson>();
//act
var actual = PersonFactory.Create(mock.Object, firstName);
//assert
Assert.AreEqual(firstName, actual.FirstName);
}
工厂是这样的
public static class PersonFactory
{
public static IPerson Create(IPerson person, string firstName)
{
person.FirstName = firstName;
return person;
}
}
我已经用 NSubsitute 尝试过这个并且让它工作正常。我怀疑它在某个地方需要一个 .object 。
解决方案
允许 mock 记录 callin 分配给属性的值
mock.SetupAllProperties(); //Stub all properties on a mock (not available on Silverlight):
[TestCase("John")]
[TestCase("Paul")]
[TestCase("George")]
[TestCase("Ringo")]
public void Create(string firstName) {
//arrange
var mock = new Mock<IPerson>();
mock.SetupAllProperties();
//act
var actual = PersonFactory.Create(mock.Object, firstName);
//assert
Assert.AreEqual(firstName, actual.FirstName);
}
您也可以直接验证属性集
mock.VerifySet(foo => foo.FirstName = firstName);
例如
[TestCase("John")]
[TestCase("Paul")]
[TestCase("George")]
[TestCase("Ringo")]
public void Create(string firstName) {
//arrange
var mock = new Mock<IPerson>();
//act
var actual = PersonFactory.Create(mock.Object, firstName);
//assert
mock.VerifySet(_ => _.FirstName = firstName);
}
推荐阅读
- caching - 如何通过标签重置PageCache?如何标记 PageCache?
- ios - 如何在 iOS 上以编程方式设置所有者个人资料紧急信息
- python - 子流程中的子流程。如何在错误时传播输出?
- reactjs - 组件不会重新渲染,但 redux 状态已通过反应钩子改变
- r - 数组上的外部函数产生 rom Vectorize 函数
- php - 此查询与 php 不兼容吗?它有一个明显的语法错误,因为我无法让它运行
- .htaccess - 剪切“?_escaped_fragment_=”并重定向到 html/php
- accessibility - 标签中带有链接的可访问假复选框
- c# - 如何显示路径文件中的图像?
- swift - 如何使包含元组的字典符合可编码的要求?