【问题标题】:ShouldBeEquivalentTo for objects with different typesShouldBeEquivalentTo 用于不同类型的对象
【发布时间】:2014-02-19 14:04:12
【问题描述】:

在我的测试中,我得到HttpRequestMessage 类型的结果,我需要断言它的属性Content 设置为正确的对象。

问题是HttpRequestMessage.Content 的(基本)类型与我要比较的对象不同,我不能像这样使用 ShouldBeEquivalentTo 和 Include :

HttpRequestMessage result = ...

result.Content.ShouldBeEquivalentTo (new ObjectContent (obj.GetType (), obj, new JsonMediaTypeFormatter ()),
                                     options => options.Including (x => x.Value));

这无法编译,因为选项使用 Content 属性类型(即 HttpContent)而不是 ObjectContent

我发现的唯一方法是有两个这样的断言:

result.Should ().BeOfType<ObjectContent> ();

((ObjectContent) result.Content).ShouldBeEquivalentTo (new ObjectContent (obj.GetType (), obj, new JsonMediaTypeFormatter ()),
                                                        options => options.Including (x => x.Value));

有没有更好的方法呢?可能是某种BeOfType,它返回转换对象流利断言而不是基本断言?

【问题讨论】:

  • 不能使用为您提供ISubjectInfo 对象的重载?然后你可以在属性路径上使用基于文本的匹配。
  • 丹尼斯,如果你的意思是反射,那我觉得会更丑。
  • 不不,有一个重载可以为您提供一个 Func 到一个 ISubjectInfo。该对象提供对完整属性路径的访问,您可能可以获得相同的效果。请看第 533 行 github.com/dennisdoomen/fluentassertions/blob/master/… 中的示例。
  • 啊,不知道。但它是在重构时会中断的魔术字符串:(
  • 我同意。但这就是为什么首先进行单元测试的原因;-)

标签: c# fluent-assertions


【解决方案1】:

我不确定是否有更简单的方法,但如果您试图避免在多个地方出现丑陋的代码,扩展方法可能会很好用:

类似的东西(我不确定这是否会按原样编译):

public static class ShouldBeHelper
{
    public static void ShouldBeSameContent(this HttpRequestMessage result, object expected)
    {
        result.Should().BeOfType<ObjectContent>();

        ((ObjectContent)result.Content).ShouldBeEquivalentTo(new ObjectContent(expected.GetType(), expected, new JsonMediaTypeFormatter(),
            options => options.Including(x => x.Value));
    }
}

【讨论】:

  • 嗯,是的,我们可以使用扩展,但我认为应该可以使用库本身而不是一直编写扩展。
猜你喜欢
  • 2013-09-10
  • 1970-01-01
  • 2011-05-04
  • 1970-01-01
  • 1970-01-01
  • 2021-04-01
  • 1970-01-01
  • 2018-04-01
  • 2017-04-22
相关资源
最近更新 更多