为了账号安全,请及时绑定邮箱和手机立即绑定

在 FluentAssertions.Primitives.ObjectAssertions

在 FluentAssertions.Primitives.ObjectAssertions

C#
肥皂起泡泡 2023-08-13 15:47:26
我已经开始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。谢谢。
查看完整描述

2 回答

?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

问题在于 Fluent Assertions 无法将_id泛型类型T_id具体类型关联起来Log

#1077中报告了类似的问题,并通过#1087解决。截至撰写本文时,我们尚未发布包含此修复程序的新版本。

2019-08-10 编辑:

Fluent Assertions 5.8.0 已发布并修复了该问题。



查看完整回答
反对 回复 2023-08-13
?
烙印99

TA贡献1829条经验 获得超13个赞

首先,ObjectAssertionsExtensions改变是有意义的


public static void BeEquivalentToExcludingId<TExpectation>(this ObjectAssertions objectAssertion,

    TExpectation expectation) where TExpectation : IEntity


public static void BeEquivalentToExcludingId(this ObjectAssertions objectAssertion,

    IEntity expectation)

我还将每个断言放入单独的测试中以定位问题。


事情发生是因为只BeEquivalentToExcludingId期望IEntity拥有财产,却得到额外的财产。这会让一切都出错。如果它不会损害您的架构,只需修改属性即可解决问题。所以,唯一的改变是:_idLogMessageIEntitystring Message


public interface IEntity

{

    [BsonId]

    ObjectId _id { get; set; }


    string Message { get; set; }

}

解决了问题。


更新:


考虑到您的评论,只需将要排除的成员设置为相同的值,调用BeEquivalentTo并设置实际值,如下所示:


public static void BeEquivalentToExcludingId(this ObjectAssertions objectAssertion, IEntity expectation)

{

    var subj = (IEntity)objectAssertion.Subject;

    var subjId = subj._id;

    var expId = expectation._id;


    subj._id = ObjectId.Empty;

    expectation._id = ObjectId.Empty;


    objectAssertion.BeEquivalentTo(expectation);


    subj._id = subjId;

    expectation._id = expId;

}

这很hacky,但是很有效。


查看完整回答
反对 回复 2023-08-13
  • 2 回答
  • 0 关注
  • 86 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信