我使用 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
}
在我的设置中,接口被定义为内部接口,它为 Subject 类和 StoreTests 类设置了 InternalsVisible。但是,当测试用例执行时,它会在 var mockStore = MockRepository.GenerateMock(); 处引发异常。说 IStore 不是公开的,因此它无法生成 Mock。
我认为这是因为 IStore 不是公开的。但是,由于我在 IStore dll 上设置了 InternalsVisibleTo,StoreTests 为该类创建一个模拟还不够吗?
现在我觉得这个问题可以通过公开 IStore 接口来解决。但是,鉴于这不是我的选择,还有其他方法可以为 IStore 创建模拟吗?