1

レガシー コードにテストを追加しようとしていますが、コードを追加し始めると、何かがおかしいと感じます。

次のコードでは、パブリック メソッド RegisterChange が次の目的で 2 つのプライベート メソッドを呼び出しています。

  1. 保存するオブジェクトを取得する
  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 を使用していますが、より一般的なテストの質問だと思います。

4

1 に答える 1