単体テスト用のモッキング フレームワークとして Rhino Mocks を使用しています。
テストしたいクラスである Subject というクラスがあります。IStore に依存しています。
IStore は次のように定義されます。
//internal interface : has InternalsVisible to both "Subject"
//and "StoreTests" class namespaces
internal interface IStore {
void Store(string name);
//other methods
}
Subject クラスは次のように定義されます。
class Subject : IStore {
private IStore internalStore;
//constructor injection
void Subject(IStore store) {
internalStore = store;
}
void Store(string name) {
internalStore.Store(name);
}
//other methods
}
RhinoMocks を使用した私のテスト クラスは次のとおりです。
//test class
class StoreTests {
Subject subject = new Subject();
[Test]
public StoreTest() {
//Arrange
var mockStore = MockRepository.GenerateMock<IStore>();
string testName = "test";
mockStore.Expect(x => x.Store(testName)).Returns(null);
//Act
subject.Store(testName);
//Assert
mockStore.VerifyAllExpectations();
}
//other test methods
}
私の設定では、インターフェイスは internal として定義されており、Subject クラスと StoreTests クラスの両方に InternalsVisible が設定されています。ただし、テスト ケースが実行されると、var mockStore = MockRepository.GenerateMock(); で例外がスローされます。IStore は公開されていないため、モックを生成できませんでした。
これは、IStore が公開されていないためだと思います。しかし、IStore dll に InternalsVisibleTo を設定したので、StoreTests がそのクラスのモックを作成するには十分ではないでしょうか?
この問題は、IStore インターフェイスを公開することで解決できるのではないかと考えています。ただし、これは私にとっては選択肢ではないため、 IStore のモックを作成できる他の方法はありますか?