2017-08-21 10 views
1

私の単体テストに問題があります。私は、私のサービスのremoveメソッドがリポジトリのremoveメソッドを呼び出すことを確認したい。ASP.NETコアのMoqサービス

私の試験方法:

[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()); 
    } 

現在、それは私がこのidが存在しないと部屋becouse例外で失敗を返します。

マイリポジトリremoveメソッドの実装:

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

とサービスあなたのモックIRoomRepositoryにGetOrFailAsync方法を設定する必要があり

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

あなたのコードは実際に 'roomServicなぜ 'Remove()'できるのでしょうか? – haim770

+0

ユニットテストでも 'GetOrFailAsync'メソッドをモックし、そこから削除する 'Room'エンティティを返す必要があります。 –

+0

GetOrFailAsyncは拡張メソッドです。私はそれを嘲ることができますか?私はこれをしました: 'roomRepositoryMock.Setup(x => x.GetAsync(room.RoomId))。ReturnAsync(room); 'それは動作します。 – Kerni

答えて

1

は、そうでない場合はモックは何も返さするつもりはありません。

だからあなたのアレンジセクションでは、次のようになります。

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); 

あなたもおそらく同様に、このコールを確認したい:

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

し、削除する正確部屋に合わせて他の検証を変更することを検討、IsAnyではなく、

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

Reaplyありがとうございますが、セットアップメソッドとGetOrFailAsyncは拡張メソッドであり、例外をスローすることができません:System.NotSupportedException:拡張メソッドの無効な検証:x => x.GetOrFailAsync(.room.RoomId) '私の 'GetAsync'メソッドを確認してください – Kerni

+0

なぜあなたは拡張メソッドを使用していますか?拡張メソッドを削除するようにデザインを変更できますか?さもなければ、Moqを使ってそのメソッドをモックすることはできません。 –

+0

私はプログラミングを学んでおり、拡張メソッドを使って例外をスローする方法を学びたかったのです。私は拡張メソッドが良い方法でない場合、私自身のミドルウェアを実装するつもりです:)。 – Kerni

関連する問題