Я использую 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
}
В моей настройке интерфейс определен как внутренний, и для него установлен InternalsVisible как для класса Subject, так и для класса StoreTests.Однако, когда тестовый пример выполняется, он выдает исключение в var mockStore = MockRepository.GenerateMock ();говоря, что IStore не является публичным и, следовательно, он не может генерировать макет.
Я думаю, это потому, что IStore не является публичным.Однако, поскольку я установил InternalsVisibleTo в dll IStore, не будет ли для StoreTests недостаточно создать макет для этого класса?
Теперь я думаю, что эту проблему можно решить, сделав интерфейс IStore общедоступным.Однако, учитывая, что это не вариант для меня, есть ли другой способ создать макет для IStore?