【问题标题】:FakeItEasy and matching Anonymous typesFakeItEasy 和匹配的匿名类型
【发布时间】:2020-03-25 18:33:00
【问题描述】:

我无法匹配使用匿名类型的期望。我是 FakeItEasy 的新手,但不喜欢嘲笑,我希望得到一些关于什么是匹配参数的正确方法的指导。我从这个线程(https://github.com/FakeItEasy/FakeItEasy/issues/532#issuecomment-135968467)了解到“谓词可以提取到方法中”。我创建了一个与名为 IsMatch 的 Func 签名匹配的方法来隐藏反射(类似于上面包含的链接#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);
    }
}
}

【问题讨论】:

    标签: c# unit-testing xunit fakeiteasy


    【解决方案1】:

    @philipwolfe,你的测试结构对我来说很合适,所以我试了一下。 当我改变时它就过去了

    {"IsDirty__c", 1}
    

    {"IsDirty__c", true}
    

    匹配ChangeStatus方法中内置的对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-03
      • 2018-10-07
      • 2022-07-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多