c# - FakeItEasy 和匹配的匿名类型
问题描述
我无法匹配使用匿名类型的期望。我是 FakeItEasy 的新手,但不喜欢嘲笑,我希望得到一些关于匹配参数的正确方法的指导。我从这个线程(https://github.com/FakeItEasy/FakeItEasy/issues/532#issuecomment-135968467)了解到“可以将谓词提取到方法中”。我创建了一个与名为IsMatch的 Func<object, bool> 签名匹配的方法来隐藏反射(类似于上面包含的 link#comment),并且 FakeItEasy 参数解析器仍然无法识别它。这是一个失败的测试。如何检查匿名类型?
using System;
using System.Collections.Generic;
using FakeItEasy;
using Xunit;
namespace UnitTests
{
public class Tests
{
private Dictionary<string, object> _properties;
[Fact]
public void AnonymousTest()
{
string id = "123456ABCD";
string status = "New Status";
var fake = A.Fake<IRepository>();
var logic = new BusinessLogic(fake);
_properties = new Dictionary<string, object>()
{
{"Status__c", status},
{"UpdatedOn__c", DateTime.Today},
{"IsDirty__c", 1},
};
var expectation = A.CallTo(() => fake.UpdateDatabase(id, A<object>.That.Matches(anon => IsMatch(anon))));
logic.ChangeStatus(id, status);
expectation.MustHaveHappenedOnceExactly();
}
private bool IsMatch(object o)
{
foreach (var prop in _properties)
{
if (!o.GetType().GetProperty(prop.Key).GetValue(o).Equals(prop.Value))
return false;
}
return true;
}
}
public interface IRepository
{
void UpdateDatabase(string id, object fields);
}
public class BusinessLogic
{
private IRepository _repo;
public BusinessLogic(IRepository repo)
{
_repo = repo;
}
public void ChangeStatus(string id, string status)
{
var fields = new
{
Status__c = status,
UpdatedOn__c = DateTime.Today,
IsDirty__c = true
};
_repo.UpdateDatabase(id, fields);
}
}
}
解决方案
@philipwolfe,你的测试结构对我来说很合适,所以我试了一下。当我改变时它过去了
{"IsDirty__c", 1}
至
{"IsDirty__c", true}
匹配内置ChangeStatus
方法的对象。
推荐阅读
- firebase - Firebase 功能 pubsub 多个计划
- aws-api-gateway - AWS DeviceFarm:如何访问传递给“ScheduleRun”API 的 test.parameters
- python - Python进程锁定主程序
- python - 使用 beautifulsoup 获取 youtube 视频的信息
- javascript - Javascript正则表达式匹配不重复的9位数字
- java - 自定义声音推送通知
- corda - Corda - 为模拟网络指定应用程序名称
- c# - 使用 C# 隐藏窗口
- python - 为灰度 MRI 数据的二进制分类构建 3D CNN,尝试 model.fit 时的数据维度问题
- java - Netty 客户端在数天或数小时后停止读取套接字数据