dotnet core 加入小组

394个成员 38个话题 创建时间:2017-09-10

关于单元测试测试API引发Linq报错的问题(已解决(0427))

发表于04-27 272次查看

解决过程:(20180427)

今天尝试重新写一个重现但是发现,重现不了。

后来对比core的版本,和ef core的版本,发现ef core的版本不一样,单元测试用的是2.1 ,api是用的是2.0。

虽然,把ef操作尝试都丢到了api中,但是单元测试的ef程序集其实仍然是2.1。

 

 

 

问题情况:(20180426)

课程:任务67:xunit+Moq+MemoryEFDbContext测试UserController

出现情况:实现视频中的代码,经过多次测试,都是只有从单元测试进入才会引发这个异常,正常API请求不会出现,尝试过添加构造函数,但是也不能解决:

为了避免是错误使用MemoryDatabase引发异常,将代码做如下改造:

  • 单元测试不做任何实例的传递和构造
  • 将MemoryDatabase放到控制器中
  • 写一个GetTest方法,调用MemoryDatabase实例
  • 使用PostMan分别调用GetTest(MemoryDatabase)和Get(Mysql)的方法

单元测试代码如下 :

  [Fact]
        public void Get_RightUser_WithRightId()
        {
            // var userContext = GetDbContext();
            // var loggerMoq = new Mock<ILogger<Fran.UserApi.Controllers.UserController>>();
            //  var logger = loggerMoq.Object;


            var controller = new Fran.UserApi.Controllers.UserController(null, null);
         
            var response = controller.GetTest();

            Assert.IsType<JsonResult>(response);


        }

 

构造MemoryDatabase的实例如下:

    public UserContext GetTestContext()
        {
            try
            {
                var options = new DbContextOptionsBuilder<UserContext>().UseInMemoryDatabase(Guid.NewGuid().ToString()).Options;


                _context = new UserContext(options);
                _context.Users.Add(new Models.User { UserId = 1, Name = "fran1" });
                _context.SaveChanges();

            }
            catch (Exception e)
            {
                _logger.LogDebug(e.InnerException.Message);
                return null;
            }
            

            return _context;
        }

 

两个get方法如下:

   [Route("")]
        [HttpGet]
        public IActionResult Get()
        {
            var user= _context.Users.AsNoTracking().Single(u=>u.UserId==1);

            if (user == null)
            {
                _logger.LogDebug("错误的用户ID");
                throw new UserOperationException($"错误的用户ID {userIdentity.UserId}");
            }            

            return Json(user);
        }

        [Route("get1")]
        [HttpGet]
        public IActionResult GetTest()
        {
            var testContext = GetTestContext();
            var user = testContext.Users.AsNoTracking().Single(u => u.UserId == 1);

            if (user == null)
            {
                _logger.LogDebug("错误的用户ID");
                throw new UserOperationException($"错误的用户ID {userIdentity.UserId}");
            }

            return Json(user);
        }

用postman测试如下:

 

 

 

再次运行测试用例(还是报错):

 

查了很多也没有找到正确的解决思路,如果有同学遇到类似的情况,还请赐教,如果老师空闲的时候可以指点一二,也是在好不过了!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

发表回复
你还没有登录,请先 登录或 注册!