在 FluentAssertions.Primitives.ObjectAssertions

我已经开始FluentAssertions在 REST 端点的集成测试中使用库。问题是我必须比较两个实体,但排除它们的_id属性。该属性是从我的界面继承的IEntity。


public interface IEntity

{

    [BsonId]

    ObjectId _id { get; set; }

}

例如Log类看起来像这样


[DataContract]

public class Log : IEntity

{

    [BsonId]

    public ObjectId _id { get; set; }


    public string Message { get; set; }

}

在测试中我像这样比较它们并且它有效


retrieved.Should()

         .BeEquivalentTo(expected, options => options.Excluding(member => member._id));

但是,当我将此功能提取到扩展方法以供重用时,它不起作用。它不会忽略该_id成员。


public static class ObjectAssertionExtensions

{

    public static void BeEquivalentToExcludingId<TExpectation>(this ObjectAssertions objectAssertion, TExpectation expectation) where TExpectation : IEntity

    {

        objectAssertion.BeEquivalentTo(expectation, options => options.Excluding(member => member._id));

    }

}

当我将通用扩展方法更改为特定类型Log时,它就可以正常工作。我在这里准备了带有示例的最小项目。有没有办法让它工作,为什么它不能正常工作?我将尝试检查 github 存储库中的代码FluentAssertions。谢谢。


肥皂起泡泡
浏览 137回答 2
2回答

一只萌萌小番薯

问题在于 Fluent Assertions 无法将_id泛型类型T与_id具体类型关联起来Log。#1077中报告了类似的问题,并通过#1087解决。截至撰写本文时,我们尚未发布包含此修复程序的新版本。2019-08-10 编辑:Fluent Assertions 5.8.0 已发布并修复了该问题。

烙印99

首先,ObjectAssertionsExtensions改变是有意义的public static void BeEquivalentToExcludingId<TExpectation>(this ObjectAssertions objectAssertion,&nbsp; &nbsp; TExpectation expectation) where TExpectation : IEntity到public static void BeEquivalentToExcludingId(this ObjectAssertions objectAssertion,&nbsp; &nbsp; IEntity expectation)我还将每个断言放入单独的测试中以定位问题。事情发生是因为只BeEquivalentToExcludingId期望IEntity拥有财产,却得到额外的财产。这会让一切都出错。如果它不会损害您的架构,只需修改属性即可解决问题。所以,唯一的改变是:_idLogMessageIEntitystring Messagepublic interface IEntity{&nbsp; &nbsp; [BsonId]&nbsp; &nbsp; ObjectId _id { get; set; }&nbsp; &nbsp; string Message { get; set; }}解决了问题。更新:考虑到您的评论,只需将要排除的成员设置为相同的值,调用BeEquivalentTo并设置实际值,如下所示:public static void BeEquivalentToExcludingId(this ObjectAssertions objectAssertion, IEntity expectation){&nbsp; &nbsp; var subj = (IEntity)objectAssertion.Subject;&nbsp; &nbsp; var subjId = subj._id;&nbsp; &nbsp; var expId = expectation._id;&nbsp; &nbsp; subj._id = ObjectId.Empty;&nbsp; &nbsp; expectation._id = ObjectId.Empty;&nbsp; &nbsp; objectAssertion.BeEquivalentTo(expectation);&nbsp; &nbsp; subj._id = subjId;&nbsp; &nbsp; expectation._id = expId;}这很hacky,但是很有效。
打开App,查看更多内容
随时随地看视频慕课网APP