2017-01-18 3 views
-1

interne virtuelle Funktion mit Eingang als Schutzobjekt Ich bin jedoch eine öffentliche API testen, intern meine API eine Funktion mit Unterschrift wieC# Mock

protected internal virtual void AddBook(Book book) 
{ 
    if (null !=book) 
     bookList= book; 
} 

Und booklist wird auch als

public virtual BookInformation bookList{ get; protected internal set; } 
definiert ruft

Ich muss diese Buchliste einstellen. Ich kann es entweder mit der Funktion AddBook oder direkt auf die Buchliste zugreifen. bookList wird auch als "protected internal set" definiert.

Ich versuchte

var mockModule = new Mock<myModule> { CallBase = true }; 
mockModule.Protected() 
    .Setup<Book>("AddBook", book); 

Aber ich Fehler erhalten, dass "AddBook" existiert nicht.

Irgendwelche Ideen was vermisse ich?

Update Ich wurde gegen Deadline gedrückt, so dass ich am Ende verspottete die Klasse. Das hat mein Problem vorerst gelöst.

+0

nicht auf die Frage bezogen, aber die Tatsache, dass ein Single 'book' kann' bookList' zugeordnet werden (was man für eine * Liste * von Büchern hält) ist etwas verwirrend. Es trotzt auch dem Namen der Methode - es ist kein * Hinzufügen * eines Buches, sondern * Einstellen * der Liste der Bücher. – Rob

+0

Hier zu überprüfen http://stackoverflow.com/questions/17569746/mocking-internal-classes-with-moq-for-unit-testing – Artem

Antwort

0

Wenn Sie .Setup<Book>("AddBook", book); schreiben, verspottet dies eine Methode mit dem Rückgabetyp Book, aber Ihr Rückgabetyp ist ungültig. Deshalb erhalten Sie eine Fehlermeldung, dass nicht existiert. Sie müssen stattdessen .Setup("AddBook", book) anrufen.

Um ein geschütztes Mitglied verspotten Sie an der Spitze Ihrer Testvorrichtung zuerst den folgenden umfassen muss:

using Moq.Protected; 

Sie dann Protected() auf Ihrem Mock nennen, nach dem Sie die generischen Setup<> mit dem Rückgabetyp verwenden können, deiner Methode.

var mock = new Mock<MyClass>(); 
mock.Protected() 
    .Setup<int>("MyProtectedGetIntMethod") 
    .Returns(1); 

Wenn die Methode void gibt dann die nicht-generische Setup() verwenden.

0

Laut Dokumentation im Quickstart

wenn Sie Argument Anpassung benötigen, können Sie MUST Verwendung ItExpr statt It

// at the top of the test fixture 
using Moq.Protected; 

// in the test 
var mock = new Mock<Invitation> { CallBase = true }; 

// if you need argument matching, you MUST use ItExpr rather than It 
// planning on improving this for vNext 
mock.Protected() 
    .Setup<Book>("AddBook", ItExpr.IsAny<Book>()); 
+0

Danke Nkoi, wird es versuchen. – BeHappy