FakeItEasy и соответствующие анонимные типы - PullRequest
0 голосов
/ 25 марта 2020

У меня возникли проблемы при сопоставлении ожидания, использующего анонимные типы. Я новичок в 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);
    }
}
}

1 Ответ

0 голосов
/ 25 марта 2020

@ philipwolfe, структура вашего теста выглядела правильно для меня, поэтому я попробовал. Он проходит, когда я изменяю

{"IsDirty__c", 1}

на

{"IsDirty__c", true}

, чтобы соответствовать объекту, встроенному в метод * ChangeStatus.

...