Kann nicht erstellen Sie eine Mock-Klasse für eine interne Typ mit Rhino Mocks
Ich bin mit Rhino Mocks als ein mocking-framework für unit-Tests.
Habe ich eine Klasse namens Thema, das ist die Klasse die ich testen will. Es hat eine Abhängigkeit von IStore.
IStore ist wie folgt definiert:
//internal interface : has InternalsVisible to both "Subject"
//and "StoreTests" class namespaces
internal interface IStore {
void Store(string name);
//other methods
}
und das Thema Klasse ist wie folgt definiert:
class Subject : IStore {
private IStore internalStore;
//constructor injection
void Subject(IStore store) {
internalStore = store;
}
void Store(string name) {
internalStore.Store(name);
}
//other methods
}
Meiner test-Klasse mit RhinoMocks ist wie folgt:
//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
}
In meinem setup, die Benutzeroberfläche ist definiert als die interne, und es hat InternalsVisible Satz sowohl Subjekt-Klasse und StoreTests Klasse. Allerdings, wenn der Testfall ausgeführt wird, löst eine Ausnahme aus, bei der var mockStore = MockRepository.GenerateMock();
zu sagen, dass IStore ist nicht öffentlich und daher könnte es nicht schaffen, eine Mock.
Ich denke, das ist, weil der IStore ist nicht öffentlich. Aber da habe ich InternalsVisibleTo auf dem IStore dll, wird es nicht ausreichend für StoreTests erstellen Sie ein mock für die Klasse?
Nun ich denke, das problem kann gelöst werden, indem die Schnittstelle IStore öffentlichkeit. Aber da dies keine option für mich, gibt es eine andere Möglichkeit kann ich erstellen ein mock für den IStore ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie versucht, dass die Vollversammlung Einbauten sichtbar zu Rhino mocks?
Sehen Rhino Mocks Interne Mitglieder für details.
Yep, sollte es ausreichen, fügen Sie Folgendes in die AssemblyInfo.cs Datei einer Baugruppe gemäß dem test:
Gut, das könnte beantwortet werden, aber für mich es hat nicht funktioniert .
So, hier ist, was ich Tat bis es funktioniert hat (könnte helfen, andere, und auch mich, auf das nächste Projekt....):
Im Menü Tools in Visual studio :
Externe tools :
Fügen Sie zum Namen, den ich trage "LongStrongName" , aber das, was Sie fühlen, Passform :
(dieser Pfad, oder wo auch immer die sn.exe ist für dich):
(Klicken Sie auf die checkbox , output auf "Use output Window")
Klicken Sie jetzt auf das Projekt, dann gehen Sie auf Extras und gehen Sie zu "LongStrongName" - Menü:
- und VS-Ausgang :
Öffnen Sie die Baugruppe.cs und fügen Sie hinzu:
Baugruppen hinzufügen, was Sie brauchen , und voila (ich musste mehrere Baugruppen).