【问题标题】:How to unit test Create POST?如何对创建 POST 进行单元测试?
【发布时间】:2012-07-15 22:36:07
【问题描述】:

如何对日记帐分录是否正确创建(使用正确值添加到数据库)进行单元测试?

    [HttpPost]
    public ActionResult Create(
        int journalId, 
        string text)
    {
        JournalEntry journalentry = new JournalEntry();
        journalentry.Text = text;
        if (ModelState.IsValid)
        {
            var journal = db.Journals.Find(journalId);               
            journalentry.Journal = journal;                
            db.JournalEntries.Add(journalentry);
            db.SaveChanges();
        }

        return View(journalentry);
    }

【问题讨论】:

  • 如果您的日记条目实体成功保存到数据库中,它应该有一个行标识符。您甚至可以在返回视图之前进行检查。
  • 可以,但是如何进行单元测试呢?

标签: c# asp.net-mvc asp.net-mvc-3 ef-code-first mstest


【解决方案1】:

您不应针对真实的 DbContext 实例进行单元测试。

您的单元测试应该模拟接口并将它们注入控制器。

例如:

public class JournalsController : Controller
{
    private readonly IJournalsRespository _journalsDb;

    public JournalsController(IJournalsRepository journalsDb)
    {
        _journalsDb = journalsDb
    }

    [HttpPost]
    public ActionResult Create(int journalId, string text)
    {
        JournalEntry journalentry = new JournalEntry();
        journalentry.Text = text;
        if (ModelState.IsValid)
        {
            var journal = _journalsDb.FindJournal(journalId);               
            journalentry.Journal = journal;                
            _journalsDb.Add(journalentry);
            _journalsDb.SaveChanges();
        }
        return View(journalentry);
    }
}

你的界面应该是这样的:

public interface IJournalsRepository
{
    Journal FindJournal(int id);
    void Add(JournalEntry journalEntry);
    void SaveChanges();
}

您可以这样进行单元测试(使用起订量):

public void Create()
{
    var db = new Mock<IJournalsRepository>();
    db.Setup(m => m.FindJournal(7)).Returns(new Journal());
    var controller = new JournalsController(db.Object);
    controller.Create(7, "test");
    db.Verify(m => m.FindJournal(7), Times.Once());
    db.Verify(m => m.Add(It.IsAny<JournalEntry>()), Times.Once());
    db.Verify(m => m.SaveChanges(), Times.Once());
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 2012-01-08
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    相关资源
    最近更新 更多