レガシー コードにテストを追加しようとしていますが、コードを追加し始めると、何かがおかしいと感じます。
次のコードでは、パブリック メソッド RegisterChange が次の目的で 2 つのプライベート メソッドを呼び出しています。
- 保存するオブジェクトを取得する
- オブジェクトを保存する
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);
}
}
そのため、リポジトリをモックするときは、プライベート メソッドのコードを調べて、どの操作をモックするかを確認する必要がありました。
このアプローチで私が見ている問題は、コードがテスト サブジェクト (パブリック メソッド) だけでなくプライベート メソッドもテストしているため、テスト サブジェクト (公開メソッド)。
後で誰かが 1 つのプライベート メソッドを変更することを決定した場合 (GetParsedEntity から例外をスローするなど)、テストは引き続き正しくパスしますが、この変更が原因でクライアント コードが失敗する可能性があります。
この特定のケースでは、C#、XUnit、および Moq を使用していますが、より一般的なテストの質問だと思います。