我正在尝试向遗留代码添加测试,当我开始添加代码时,我感觉有些地方出了问题。
在以下代码中,公共方法 RegisterChange 调用两个私有方法:
- 获取要存储的对象
- 存储对象
public class ChangeService {
IRepository repository;
public ChangeService(IRepository repository){
this.repository = repository;
}
public bool RegisterChange( int entityId ){
var entity = GetParsedEntity( entityId );
SaveEntity( entity );
return true;
}
private Entity GetParsedEntity( int id ) {
var entity = repository.GetEntityById( id );
return new Entity{ Name = entity.Name };
}
private void SaveEntity( Entity entity ) {
repository.Save( Entity );
}
}
public class ChangeServiceFact(){
[Fact]
public void When_valid_entity__Should_save_entity(){
var mock = new Mock<IRepository>();
var service = new ChangeService(mock.object);
var result = service.RegisterChange( 0 );
Assert.True(result);
}
}
因此,当我模拟存储库时,我必须去检查私有方法的代码以了解要模拟哪些操作。
我在这种方法中看到的问题是,由于代码不仅测试测试对象(公共方法)而且测试私有方法,通过查看测试对象并不清楚哪个应该是测试结果(公共方法)。
如果稍后有人决定修改一个私有方法(例如从 GetParsedEntity 抛出异常),测试将继续正确通过,但客户端代码可能会因为此更改而失败。
在这种特殊情况下,我使用 C#、XUnit 和 Moq,但我认为这是一个更一般的测试问题。