[юнит-тестирование новичка] [c #]
Рассмотрим следующий сценарий:
Я использую Silverlight и вызываю службу WCF.Silverlight может вызывать службы WCF только асинхронно. Я создаю оболочку вокруг службы WCF, чтобы я мог работать с параметрами Action.(делает клиентский код намного чище).
Итак, у меня есть асинхронная служба, которая извлекает комнаты собраний.
public interface IMeetingRoomService
{
void GetRooms(Action<List<MeetingRoom>> result);
}
Превращение GetRooms в List<MeetingRoom> GetRooms()
не вариант.
Я хочу использовать эту службу в ViewModel для установки открытого свойства с именем Rooms.
public class SomeViewModel
{
private readonly IMeetingRoomService _meetingRoomService;
public List<MeetingRoom> Rooms { get; set; }
public SomeViewModel(IMeetingRoomService meetingRoomService)
{
this._meetingRoomService = meetingRoomService;
}
public void GetRooms()
{
// Code that calls the service and sets this.Rooms
_meetingRoomService.GetRooms(result => Rooms = result);
}
}
Я хочу провести модульное тестирование реализации SomeViewModel.GetRooms ().(Для этого вопроса я быстро написал реализацию, но на самом деле я пытаюсь использовать TDD.)
Как мне закончить этот тест?Я использую NUnit и Moq.
[Test]
public void GetRooms_ShouldSetRooms()
{
var theRooms = new List<MeetingRoom>
{
new MeetingRoom(1, "some room"),
new MeetingRoom(2, "some other room"),
};
var meetingRoomService = new Mock<IMeetingRoomService>();
//How do I setup meetingRoomService so that it gives theRooms in the Action??
var viewModel = new SomeViewModel(meetingRoomService.Object);
viewModel.GetRooms();
Assert.AreEqual(theRooms, viewModel .Rooms);
}
РЕДАКТИРОВАТЬ:
Решение
Сначала прочитайте ответ Стефана.
Этоэто тестовый код, который я написал в итоге благодаря ответу Стефана:
[Test]
public void GetRooms_ShouldSetRooms()
{
var meetingRoomService = new Mock<IMeetingRoomService>();
var shell = new ShellViewModel(meetingRoomService.Object);
var theRooms = new List<MeetingRoom>
{
new MeetingRoom(1, "some room"),
new MeetingRoom(2, "some other room"),
};
meetingRoomService
.Setup(service => service.GetRooms(It.IsAny<Action<List<MeetingRoom>>>()))
.Callback((Action<List<MeetingRoom>> action) => action(theRooms));
shell.GetRooms();
Assert.AreEqual(theRooms, shell.Rooms);
}