gpt4 book ai didi

unit-testing - 可以使用 Autodata xUnit Theories 注入(inject)的 SUT 的特定构造函数参数吗?

转载 作者:行者123 更新时间:2023-12-04 05:11:47 28 4
gpt4 key购买 nike

考虑以下测试,

[Theory, MyConventions]
public void GetClientExtensionReturnsCorrectValue(BuilderStrategy sut)
{
var expected = ""; // <--??? the value injected into BuilderStrategy
var actual = sut.GetClientExtension();
Assert.Equal(expected, actual);
}

以及我正在使用的自定义属性:

public class MyConventionsAttribute : AutoDataAttribute {
public MyConventionsAttribute()
: base(new Fixture().Customize(new AutoMoqCustomization())) {}
}

和 SUT:

class BuilderStrategy {
private readonly string _clientID;
private readonly IDependency _dependency;
public void BuilderStrategy(string clientID, IDependency dependency) {
_clientID = clientID;
_dependency = dependency;
}
public string GetClientExtension() {
return _clientID.Substring(_clientID.LastIndexOf("-") + 1);
}
}

我需要知道构造函数参数 clientID 中注入(inject)了什么值,以便我可以使用它与 GetClientExtension 的输出进行比较。是否可以在编写这种将 SUT 注入(inject)测试方法的测试样式的同时执行此操作?

最佳答案

如果您将注入(inject)的 clientID(以及 dependency)公开为只读属性,您始终可以查询它们的值:

public class BuilderStrategy {
private readonly string _clientID;
private readonly IDependency _dependency;
public void BuilderStrategy(string clientID, IDependency dependency) {
_clientID = clientID;
_dependency = dependency;
}
public string GetClientExtension() {
return _clientID.Substring(_clientID.LastIndexOf("-") + 1);
}

public string ClientID
{
get { return _clientID; }
}

public IDependency Dependency
{
get { return _dependency; }
}
}

doesn't break encapsulation, but is rather known as Structural Inspection .

通过此更改,您现在可以像这样重写测试:

[Theory, MyConventions]
public void GetClientExtensionReturnsCorrectValue(BuilderStrategy sut)
{
var expected = sut.ClientID.Substring(sut.ClientID.LastIndexOf("-") + 1);
var actual = sut.GetClientExtension();
Assert.Equal(expected, actual);
}

有些人不喜欢在单元测试中复制生产代码,但我宁愿争辩说,如果您遵循测试驱动开发,那么生产代码会复制测试代码。

无论如何,这是一种称为 Derived Value 的技术.在我看来,as long as it retains a cyclomatic complexity of 1, we can still trust the test .此外,只要重复代码只出现在两个地方,rule of three建议我们应该保持这种状态。

关于unit-testing - 可以使用 Autodata xUnit Theories 注入(inject)的 SUT 的特定构造函数参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18238348/

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