У меня возникли проблемы при сопоставлении ожидания, использующего анонимные типы. Я новичок в FakeItEasy, но не для насмешек и хотел бы получить некоторые рекомендации о том, как правильно сопоставлять аргументы. Я понимаю из этой темы (https://github.com/FakeItEasy/FakeItEasy/issues/532#issuecomment -135968467 ), что «предикат может быть извлечен в метод». Я создал метод, который соответствует Fun c подпись с именем IsMatch , чтобы скрыть отражение (аналогично ссылке # комментарий, включенный выше), а анализатор аргументов 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);
}
}
}