2013-05-08 4 views
2

Я относительно новичок в модульном тестировании и ASP.NET MVC в целом, и я пытаюсь написать свой первый модульный тест против простого действия контроллера и репозитория (как показано ниже) с использованием Moq.Возвращение коллекции через репозиторий с использованием Moq

ISubmissionRepository.cs

public interface ISubmissionRepository 
{ 
    IList<Submission> GetRecent(int limit = 10); 
} 

HomeController.cs:

/* Injected using Unit DIC */ 
public HomeController(ISubmissionRepository submissionRepository) 
{ 
    _submissionRepo = submissionRepository; 
} 

public ActionResult Index() 
{ 

    var latestList = _submissionRepo.GetRecent(); 
    var viewModel = new IndexViewModel { 
     NumberOfSubmissions = latestList.Count(), 
     LatestSubmissions = latestList 
    }; 
    return View(viewModel); 
} 

Ниже приводится тестовый блок я пишу, однако мой издевались вызов хранилище не кажется, возвращая что-нибудь, и я понятия не имею, почему. Я правильно издеваюсь над своим репозиторием?

HomeControllerTest.cs

[Test] 
public void Index() 
{ 
    IList<Submission> submissions = new List<Submission> 
    { 
     new Submission {Credit = "John Doe", Description = "Hello world", ID = 1, Title = "Example Post"}, 
     new Submission {Credit = "John Doe", Description = "Hello world", ID = 2, Title = "Example Post"} 
    }; 

    Mock<ISubmissionRepository> mockRepo = new Mock<ISubmissionRepository>(); 
    mockRepo.Setup(x => x.GetRecent(2)).Returns(submissions); 

    /* 
    * This appears to return null when a breakpoint is set 
    var obj = mockRepo.Object; 
    IList<Submission> temp = obj.GetRecent(2); 
    */ 

    controller = new HomeController(mockRepo.Object); 
    ViewResult result = controller.Index() as ViewResult; 

    Assert.NotNull(result); 
    Assert.IsInstanceOf<IndexViewModel>(result); 

} 

ответ

1

Ну в вашем контроллере вы звоните:

var latestList = _submissionRepo.GetRecent(); 

Ваш макет настроен для GetRecent(2).

Измените макет установки для:

mockRepo.Setup(x => x.GetRecent()).Returns(submissions); 

EDIT

Кроме того, ваш утверждают должно быть:

Assert.IsInstanceOf<IndexViewModel>(result.Model); 
+1

'result.Model', казалось, отлично справлялся с работой! Спасибо. –

2

Эта линия

mockRepo.Setup(x => x.GetRecent(2)).Returns(submissions); 

Сообщает малое количество заказа, чтобы вернуть коллекцию, когда она вызывается парам 2. контроллер называет его как

var latestList = _submissionRepo.GetRecent(); 

Это отдельные настройки в Moq, поэтому ваш результат не возвращается. вы можете удалить 2 в тесте или заставить ваш контроллер вызвать его с 2 для получения возврата.

EDIT - обновление ответ

попробуйте установить макет как:

mockRepo.Setup(x => x.GetRecent(It.Is<int>(i => i == 2))).Returns(submissions); 

Это говорит, что только вернуться, когда он Престол 2 в списке аргументов. Вы также должны будете вызвать его с помощью 2 для возврата на работу.

В противном случае, установите его, так как это быть агностиком параметра

mockRepo.Setup(x => x.GetRecent(It.IsAny<int>())).Returns(submissions); 
+0

Я попытался удалить все ссылки на 2 из аргументов и вызов по-прежнему кажется, что возвращает null вместо коллекции? –

+0

Возможно, вы уже это сделали, но попробуйте использовать It.IsAny () в качестве условия совпадения, чтобы увидеть, вообще ли вызвана функция GetRecent(). Если он вызывается, то он, вероятно, соответствует GetRecent (10) - аргументу по умолчанию. – AlanT

+0

@AlanT Да, я пробовал это, но безрезультатно. Эта проблема действительно меня озадачила. –

Смежные вопросы