2017-08-21 1 views
1

Ich habe ein Problem mit meinen Komponententests. Ich möchte überprüfen, dass meine remove-Methode im Dienst Methode remove im Repository aufgerufen wird.Moq Service in ASP.NET Core

Meine Testmethode:

[Fact] 
    public async Task Remove_room_async_should_invoke_remove_room_async_on_room_repository() 
    { 
     //Arrange 
     var room = new Room(Guid.NewGuid(), "A-11"); 
     var roomRepositoryMock = new Mock<IRoomRepository>(); 
     var mapperMock = new Mock<IMapper>(); 
     var roomService = new RoomService(roomRepositoryMock.Object, mapperMock.Object); 

     //Act 
     await roomService.RemoveAsync(room.RoomId); 

     //Assert 
     roomRepositoryMock.Verify(x => x.RemoveAsync(It.IsAny<Room>()), Times.Once()); 
    } 

Derzeit zurückgeben mich mit dieser ID mit Ausnahme becouse Raum FAIL existiert nicht.

Mein Repository entfernen Methode Implementierung:

public async Task RemoveAsync(Room room) 
{ 
    _rooms.Remove(room); 
    await Task.CompletedTask; 
} 

und Service

public async Task RemoveAsync(Guid roomId) 
{ 
    var room = await _roomRepository.GetOrFailAsync(roomId); 
    await _roomRepository.RemoveAsync(room); 
} 
+1

Ihr Code ist nicht wirklich 'Add()' irgendetwas mit 'roomServic e', warum könnte es 'Remove()'? – haim770

+0

Sie müssen die 'GetOrFailAsync'-Methode auch im Unit-Test verspotten und eine' Room'-Entity zurückgeben, um sie zu entfernen. –

+0

GetOrFailAsync ist eine Erweiterungsmethode. Kann ich es verspotten? Ich habe das getan: 'roomRepositoryMock.Setup (x => x.GetAsync (room.RoomId)). ReturnsAsync (Raum); 'Es funktioniert. – Kerni

Antwort

1

Sie benötigen die GetOrFailAsync Methode auf Ihrem Mock IRoomRepository einzurichten, da sonst die Mock wird sich nichts zurück.

Ihr So ordnen Abschnitt wird:

roomRepositoryMock.Verify(r => r.GetOrFailAsync(room.Id), Times.Once()); 

Und betrachten Sie Ihre anderen Überprüfung zu ändern passen genau den Raum, den Sie löschen möchten:

var room = new Room(Guid.NewGuid(), "A-11"); 
var roomRepositoryMock = new Mock<IRoomRepository>(); 
roomRepositoryMock.Setup(r => r.GetOrFailAsync).Returns(room); 
var mapperMock = new Mock<IMapper>(); 
var roomService = new RoomService(roomRepositoryMock.Object, mapperMock.Object); 

Sie wahrscheinlich auch auch diesen Anruf überprüfen möchten anstelle von IsAny:

roomRepositoryMock.Verify(x => x.RemoveAsync(room), Times.Once()); 
+0

Danke für reaply, aber ich kann GetOrFailAsync nicht einrichten und überprüfen, da es die Erweiterungsmethode ist und Ausnahme auslöst: 'System.NotSupportedException: Ungültige Überprüfung auf eine Erweiterungsmethode: x => x.GetOrFailAsync (.room.RoomId)' aber ich kann Überprüfen Sie meine 'GetAsync' Methode – Kerni

+0

Warum verwenden Sie eine Erweiterungsmethode? Können Sie Ihr Design ändern, um die Erweiterungsmethode zu entfernen? Andernfalls können Sie diese Methode mit Moq nicht vortäuschen. –

+0

Ich lerne Programmierung und ich wollte lernen, wie man Extension-Methoden verwendet, um Ausnahmen auszulösen. Ich werde meine eigene Middleware implementieren, wenn Erweiterungsmethoden nicht gut sind :). – Kerni

Verwandte Themen