如何将参数传递给使用System的数据访问层.动作作为输入参数
本文关键字:访问 作作 参数 输入 数据 参数传递 System | 更新日期: 2023-09-27 17:50:39
我正在尝试为我最近继承的应用程序创建一些单元测试。目前正在使用NSubstitute,因为这是以前的程序员使用的,但我不依附于它。
我正在测试的方法调用DataService类的Create方法。
调用创建方法
var contactProductLink = this.dsService.Create<ContactProductLink>(x =>
{
x.ContactRoleId = prod.RoleId;
x.ContactId = contactViewModel.ContactId;
x.ProductId = prod.ProductId;
x.Active = true;
x.InsertDate = DateTime.Now;
x.InsertUserId = user.employeeId;
x.UpdateDate = DateTime.Now;
x.UpdateUserId = user.employeeId;
});
DataService Create Method:
public TEntity Create<TEntity>(Action<TEntity> propertySetter = null) where TEntity : class
{
var tEntity = this.Context.Create<TEntity>();
if (propertySetter != null)
{
propertySetter(tEntity);
}
return tEntity;
}
我采用的方法(也许有更好的方法)是使用NSubstitute模拟DataService。当我在最后做断言时,我检查以确保调用了Create方法:
mockDataSupplierService.Received().Create<ContactProductLink>(Arg.Any<Action<ContactProductLink>>());
但是,我还想验证发送给该方法的输入是否正确,这就是我遇到麻烦的地方。我可以得到系统。传递给Create方法的Action对象,但我不知道如何提取参数(如在调用Create方法代码片段中发布的ContactRoleId, ContactId等)。
那么在所有这些之后我要问的是:
- 如何访问这些输入参数,以便验证传递给数据服务的参数是否正确?这可能吗?
- 是否有比我目前正在尝试做的更好的方法来做到这一点?
解决方案/strong>
//Arrange
mockDataSupplierService.Create<ContactProductLink>(Arg.Do<Action<ContactProductLink>>(x=> actionToPopulateEntity = x));
//Assert
mockDataSupplierService.Received().Create<ContactProductLink>(Arg.Any<Action<ContactProductLink>>());
var entity = new ContactProductLink();
actionToPopulateEntity.Invoke(entity);
Assert.AreEqual(ExpectedContactId, entity.ContactId);
如何访问这些输入参数,以便验证传递给数据服务的参数是否正确?这可能吗?
本质上你不能,因为不可能从动作中提取"代码"细节(考虑当你传递一个没有设置任何属性的动作时会发生什么——这是完全合法的,但会破坏假设的机制)。
但是,您可以尝试这样做:
- 使用初始值创建实体
- 使用
Arg.Invoke
参数,告诉 NSubstitute使用所选对象作为动作参数 - 验证实体属性值更改
// Arrange
var entity = new ContactProductLink
{
ContactRoleId = // ...
// ...
};
mockDataSupplierService
.Create<ContactProductLink>(Arg<ContactProductLink>.Invoke(entity));
// Act
// ...
Assert.That(entity.ContactRoleId, Is.EqualTo(2));
// ...