2

ジャーナルエントリが正しく作成されたこと (正しい値でデータベースに追加されたこと) を単体テストするにはどうすればよいですか?

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

1 に答える 1

3

実際の 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();
}

これを次のように単体テストできます(Moqを使用):

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());
}
于 2012-07-16T00:16:14.990 に答える