设置ExclusionNestedObjects时导致FluentAssertions导致ObjectDisposedException

时间:2018-09-26 16:37:51

标签: c# fluent-assertions

我的EF模型定义如下:

public class ProgramManagerRolePermission
{
    [Key, Column(Order = 1)]
    public Guid ShardKey { get; set; }

    [Key, Column(Order = 2)]
    public Guid RoleId { get; set; }

    [Key, Column(Order = 3)]
    public Guid PermissionId { get; set; }

    [ForeignKey(nameof(RoleId))]
    public virtual ProgramManagerRole Role { get; set; }

    [ForeignKey(nameof(PermissionId))]
    public virtual ProgramManagerPermission Permission { get; set; }
}

我有以下测试代码:

using (var repo = IdentityProgramRepositoryFactory.Get())
{
    var role = repo.ProgramManagerRoles
        .Include(r => r.Permissions)
        .SingleOrDefault(r => r.Id == roleId);
    role.Permissions.Should().BeEquivalentTo(new[] {
        new Repo.ProgramManagerRolePermission
        {
            PermissionId = ProgramManagerPermissions.GrantOrRevokeRoles.Id,
            RoleId = roleId,
            ShardKey = identityProgramId
        },
        new Repo.ProgramManagerRolePermission
        {
            PermissionId = ProgramManagerPermissions.ManageNode.Id,
            RoleId = roleId,
            ShardKey = identityProgramId
        }
    }, options => options.ExcludingNestedObjects());
}

当我运行它时,测试失败,因为消息中抛出了ObjectDisposedException

  

安全手柄已关闭

如果我将最后一行更改为:

}, options => options.Excluding(p => p.Role).Excluding(p => p.Permission));

然后测试成功运行。

仅有的两个嵌套对象是RolePermission。当我明确排除它们时,测试有效,当我告诉它排除所有嵌套对象时,它似乎仍在尝试浏览它们。

有人遇到过吗?关于为什么我认为应该发生的事情没有任何解释吗?

1 个答案:

答案 0 :(得分:2)

您正在使用ExcludingNestedObjects,这意味着它将不会在RolePermission对象公开的对象之间进行结构比较。这些是您的根对象的属性。但是它仍然会尝试做一个简单的相等检查。