gpt4 book ai didi

无效构造函数参数的自动修复测试

转载 作者:行者123 更新时间:2023-12-04 02:02:49 24 4
gpt4 key购买 nike

我有以下类(class)和测试。我想测试将空值作为参数传递给构造函数,并期望得到 ArgumentNullException .但由于我使用 Autofixture 的 CreateAnonymous方法我得到一个 TargetInvocationException反而。

编写此类测试的正确方法是什么?

public sealed class CreateObject : Command {
// Properties
public ObjectId[] Ids { get; private set; }
public ObjectTypeId ObjectType { get; private set; }
public UserId CreatedBy { get; private set; }

// Constructor
public CreateObject(ObjectId[] ids, ObjectTypeId objectType, UserId createdBy) {
Guard.NotNull(ids, "ids");
Guard.NotNull(objectType, "objectType");
Guard.NotNull(createdBy, "createdBy");

Ids = ids;
ObjectType = objectType;
CreatedBy = createdBy;
}
}

[TestMethod]
[ExpectedException(typeof(ArgumentNullException))]
public void constructor_with_null_ids_throw() {
fixture.Register<ObjectId[]>(() => null);
fixture.CreateAnonymous<CreateObject>();
}

最佳答案

海事组织,Ruben Bartelink's comment是最好的答案。

AutoFixture.Idioms ,你可以这样做:

var fixture = new Fixture();
var assertion = new GuardClauseAssertion(fixture);
assertion.Verify(typeof(CreateObject).GetConstructors());

如果任何构造函数中的任何构造函数参数缺少保护子句,Verify 方法将为您提供非常详细的异常消息。

FWIW,AutoFixture 广泛使用反射,所以我不认为它是一个错误,它会抛出 TargetInvocationException .虽然它可以解开所有 TargetInvocationException实例并重新抛出它们的 InnerException属性,这也意味着处理(可能)有值(value)的信息(例如 AutoFixture 堆栈跟踪)。我已经考虑过这一点,但正是出于这个原因,我不想在这个方向上采用 AutoFixture。客户端总是可以过滤掉信息,但如果信息被过早删除,则没有客户端可以取回它。

如果您更喜欢另一种方法,那么编写一个解包异常的辅助方法并不太难——也许是这样的:
public Exception Unwrap(this Exception e)
{
var tie = e as TargetInvocationException;
if (tie != null)
return tie.InnerException;
return e;
}

关于无效构造函数参数的自动修复测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15078400/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com