单元测试就是测试一个特定的单元。因此,如果您正在为 A 类编写规范,那么如果 A 类没有 B 类和 C 类的真正具体版本,那将是理想的。
好的,我后来注意到这个问题的标签包括 C++ / Python,但原理是一样的:
public class A : InterfaceA
{
InterfaceB b;
InterfaceC c;
public A(InterfaceB b, InterfaceC c) {
this._b = b;
this._c = c; }
public string SomeOperation(string input)
{
return this._b.SomeOtherOperation(input)
+ this._c.EvenAnotherOperation(input);
}
}
由于上述系统 A 向系统 B 和 C 注入了接口,因此您可以只对系统 A 进行单元测试,而无需任何其他系统执行真正的功能。这是单元测试。
这是一种从创建到完成处理系统的巧妙方法,每个行为都有不同的 When 规范:
public class When_system_A_has_some_operation_called_with_valid_input : SystemASpecification
{
private string _actualString;
private string _expectedString;
private string _input;
private string _returnB;
private string _returnC;
[It]
public void Should_return_the_expected_string()
{
_actualString.Should().Be.EqualTo(this._expectedString);
}
public override void GivenThat()
{
var randomGenerator = new RandomGenerator();
this._input = randomGenerator.Generate<string>();
this._returnB = randomGenerator.Generate<string>();
this._returnC = randomGenerator.Generate<string>();
Dep<InterfaceB>().Stub(b => b.SomeOtherOperation(_input))
.Return(this._returnB);
Dep<InterfaceC>().Stub(c => c.EvenAnotherOperation(_input))
.Return(this._returnC);
this._expectedString = this._returnB + this._returnC;
}
public override void WhenIRun()
{
this._actualString = Sut.SomeOperation(this._input);
}
}
所以总而言之,一个单元/规范可以有多种行为,并且规范随着您开发单元/系统而增长;如果您的测试系统依赖于其中的其他具体系统,请当心。