Я использую 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 не является общедоступным, и поэтому он не может генерировать Mock.
Я думаю, это потому, что IStore не является публичным. Однако, поскольку я установил InternalsVisibleTo на dll IStore, не будет ли достаточно, чтобы StoreTests создавал макет для этого класса?
Теперь я думаю, что эту проблему можно решить, открыв интерфейс IStore. Однако, учитывая, что это не вариант для меня, есть ли другой способ создать макет для IStore?