0

次のようなクラスがあるとしましょう:

public class Context {
  public void initialize() { ... }
}

そしてそれを使用する別のクラス:

public class Service {
  public Context getContext() { return context; }

  internal Service(Context ctx) {
    context = ctx;
    context.initialize();
  }

  private Context context;
}

最後に、クラス構築時に呼び出されるService検証の単体テストを書きたいとしましょう。単体テストなので、実際のクラスを使用する代わりにContext.initalizeモックしたいと思います。インターフェイスを作成し、次のようにコードを書き直すContext必要がある Moq を使用します。IContext

public interface IContext {
  void initialize();
}

public class Context : IContext {
  public void initialize() { ... }
}

public class Service {
  public IContext getContext() { return context; }

  internal Service(IContext ctx) {
    context = ctx;
    context.initialize();
  }

  private IContext context;
}

[TestFixture()]
public class ServiceTest {
  [Test()]
  public shouldInitializeContextWhenConstructed() {
    Mock<IContext> mockContext = new Mock<IContext>();
    Service service = new Service(mockContext);
    mockContext.Verify(c => c.initialize(), Times.Once());
  }
}

ただし、純粋にテスト関連のアーティファクトであるため、(関数を介して) クラスIContextのユーザーに公開することは避けたいと思います。ここで正しい解決策は何ですか?ServiceService.getContext

4

1 に答える 1