2

私は単体テストと ASP.NET MVC 全体に比較的慣れていないので、単純なコントローラー アクションとリポジトリ (以下を参照) に対して、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);

}
4

2 に答える 2

2

この行

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

param 2で呼び出されたときにコレクションを返すようにmoqに指示します。コントローラーはそれを次のように呼び出します

var latestList = _submissionRepo.GetRecent();

これらは Moq で個別に設定されているため、結果は返されません。テストで 2 を削除するか、コントローラーで 2 を呼び出して戻り値を取得できます。

編集 - 回答を更新

モックを次のように設定してみてください:

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);
于 2013-05-09T16:06:38.513 に答える
1

あなたが呼んでいるコントローラーでよく:

var latestList = _submissionRepo.GetRecent();

あなたのモックは 用にセットアップされていGetRecent(2)ます。

モックのセットアップを次のように変更します。

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

編集

また、あなたのアサートは次のようになります。

Assert.IsInstanceOf<IndexViewModel>(result.Model);
于 2013-05-13T08:18:51.827 に答える