次のようなクラスがあるとしましょう:
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
のユーザーに公開することは避けたいと思います。ここで正しい解決策は何ですか?Service
Service.getContext