仅验证公共构造函数时GuardClauseAssertion未触发失败的原因
问题解答
核心原因
你的单元测试未触发失败,本质是GuardClauseAssertion的校验范围和代码逻辑不匹配:
- 你只要求校验
TestClass的公共构造函数,但TestClass的构造函数本身没有对firstDependency参数做任何null守卫——它只是把参数直接传递给基类构造函数,自身不会抛出ArgumentNullException。 GuardClauseAssertion默认仅校验被指定的构造函数自身的参数验证逻辑,不会自动递归检查基类的构造函数。基类的构造函数是protected的,既不在你指定的校验范围内,而且它本身也没有添加null守卫,所以即使传入null也不会触发异常。
额外细节
你在TestClass构造函数中给基类的第二个参数固定传了string.Empty,这个值不会被AutoFixture生成的测试数据覆盖,所以基类的secondDependency永远不会是null,也不会因为这个参数触发异常。
如何让测试正确触发失败
如果想要校验基类构造函数的参数守卫,需要显式指定基类的构造函数进行校验:
// 同时校验TestClass的公共构造函数和TestBaseClass的protected构造函数 assertion.Verify(typeof(TestBaseClass).GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic)); assertion.Verify(typeof(TestClass).GetConstructors(BindingFlags.Public));
或者给TestClass的构造函数添加自己的守卫子句,确保参数非null后再传递给基类:
public TestClass(string firstDependency) : base(firstDependency ?? throw new ArgumentNullException(nameof(firstDependency)), string.Empty) { }
内容的提问来源于stack exchange,提问作者henkie
相关产品推荐
相关产品推荐

