AspNet Core TestServer DbContext.Update(模型)不保存更改

时间:2017-05-04 09:29:45

标签: c# integration-testing entity-framework-core asp.net-core-1.1

我目前尝试创建一个测试编辑步骤的集成测试。编辑工作(更改保存在数据库中,编辑在正常程序使用期间工作),但更改不是"存储"在test-dbcontext中。因此,如果我再次从上下文中获取已编辑的模型,它仍然具有旧值。 但是,在测试方法中可以看到对dbcontext(AuditChange)的进一步添加。

我已经尝试过其他数据库(Sqlite,InMemoryDatabase),但仍然存在同样的问题。

我是否想念一些东西,或者这是一些有趣的"错误的地方?

此致 的Matthias

有些缩短的测试方法:

    [TestMethod]
    public async Task LocalUserCompleteRunHandlingTestAsync() {
        TestServer server = GetTestServer("CompleteRunHandling");
        MySqlDbContext context = server.Host.Services.GetService<MySqlDbContext>();

        try {
            // Creating model and asserting of newly created model removed.

            // Get Edit 
            var editGetResult = await client.GetAsync("/Fruit/Edit/" + fruit.Id);
            Assert.IsTrue(editGetResult.IsSuccessStatusCode);

            // Post Edit
            formTokenVal = await editGetResult.GetAntiForgeryFormToken();
            var editedName = "edited Name";
            var editedComment = "edited Comment";
            var postEditData = new Dictionary<string, string>();
            postEditData.Add("Id", fruit.Id.ToString());
            postEditData.Add("Name", editedName);
            postEditData.Add("Comment", editedComment);
            postEditData.Add(formTokenVal.Key, formTokenVal.Value);
            var editPostResult = await client.PostAsync("/Fruit/Edit/" + fruit.Id, new FormUrlEncodedContent(postEditData));
            Assert.AreEqual(302, (int)editPostResult.StatusCode); // If successful, redirect to index.
            context = server.Host.Services.GetService<MySqlDbContext>();
            var editedFruit = context.Fruit.Single(r => r.Id == fruit.Id);
            Assert.AreEqual(editedComment, editedFruit.Comment); // Assert fails, editedFruit.Comment is still the old value.
            Assert.AreEqual(editedName, editedFruit.Name);
            // Further code removed

        } finally {
            context.Database.EnsureDeleted();
        }
    }

控制器方法:

public IActionResult Edit(FruitEditViewModel fruitViewModel) {
    if (ModelState.IsValid) {
        Fruit fruit= _context.Fruit.Single(f => f.Id == fruitViewModel.Id);
        _auditTrailService.TakeSnapshotBefore(fruit);

        fruit.Comment = fruitViewModel.Comment;
        fruit.Name = fruitViewModel.Name;
        _context.Fruit.Update(fruit);
        AuditChange auditChange = _auditTrailService.CompareObjects(fruit, GetCurrentUserId(), AuditActionType.Update);
        if (auditChange != null) {
            _context.Add(auditChange);
        }
        _context.SaveChanges();

        return RedirectToAction("Index");
    }
    return View(fruitViewModel);
}

0 个答案:

没有答案