c# - 在 .Net Core 中测试 Controller 总是返回 false?

标签 c# unit-testing asp.net-core moq xunit.net

我编写了以下 XUnit 测试来测试 .Net Core WebApi Controller 的操作:

namespace VistaBest.XUnitTest.Api.Test
{
    public class Account_UnitTest
    {
        [Fact]
        public void ValidateUserTest()
        {
            const string username = "admin";
            const string password = "admin";
            var usersBusinessObjectMock = new Mock<IUsersBusinessObject>();
            usersBusinessObjectMock.Setup(service => service.ValidateUser(username, password)).Returns(() => true);
            var controller = new AccountController(usersBusinessObjectMock.Object);
            var actionResult = controller.ValidateUser(new LoginModel
            {
                Username = username,
                Password = password
            });
            var okObjectResult = Assert.IsType<OkObjectResult>(actionResult);
            var result = okObjectResult.Value as bool?;
            Assert.True(result);
        }
    }
}

账户 Controller :

namespace VistaBest.Api.Controllers
{
    public class AccountController : BaseController
    {
        private readonly IUsersBusinessObject _usersBusinessObject;
        public AccountController(IUsersBusinessObject usersBusinessObject)
        {
            _usersBusinessObject = usersBusinessObject;
        }

        [HttpPost]
        public IActionResult ValidateUser(LoginModel model)
        {
            if(!ModelState.IsValid) return BadRequest(ModelState);
            return Ok(_usersBusinessObject.ValidateUser(model.Username, model.Password.ToMd5Hash()));
        }
    }
}

IUsersBusinessObject:

namespace VistaBest.Data.BusinessObjects
{
    public interface IUsersBusinessObject
    {
        bool ValidateUser(string username, string password);
        UserModel SelectByUsername(string username);
    }

    public class UsersBusinessObject : BaseBusinessObject, IUsersBusinessObject
    {
        public UsersBusinessObject(IDbConnection connection) : base(connection)
        {

        }

        private const string TableName = "Users";

        public bool ValidateUser(string username, string password)
        {
            var query = $"SELECT COUNT(*) FROM [{TableName}] WHERE UserName = @username and Password = @password";
            return DbConnection.QueryFirst<int>(query, new { username, password }) == 1;
        }
}

如你所见,我说 usersBusinessObjectMock 必须返回 true:

usersBusinessObjectMock
    .Setup(service => service.ValidateUser(username, password))
    .Returns(() => true);

但是 var result = okObjectResult.Value as bool?; 总是 false

怎么了?

Test Error Screen Shot

最佳答案

在阅读您的代码大约 10 分钟后,因为这个错误真的很难找到。你做的一切都是对的......

        var okObjectResult = Assert.IsType<OkObjectResult>(actionResult);
        var result = okObjectResult.Value as bool?;
        Assert.True(result);

但这是错误...

var 很危险... 你的变量 okObjectResult 不是来自 OkObjectResult 类型......这就是为什么你的断言永远不会是真的...... 我确定你不是要输入

Assert.IsType<OkObjectResult>(actionResult);
var okObjectResult = (OkObjectResult) actionResult;

关于c# - 在 .Net Core 中测试 Controller 总是返回 false?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47309769/

相关文章:

c# - 查找表中的行数

javascript - ReferenceError : function is not defined. 在 Jasmine 单元测试中

c# - 如何验证通过 cookie 传递的 JWT?

c# - 如何在 OnPost 之后将模型保留在我的 View 中?

c# - 接口(interface)类

c# - 在 c# net int.parse 中,输入字符串的格式不正确

c# - 检查 URL 是否为 C# .NET 中的 torrent

unit-testing - 我如何 Jest 模拟react-native-ibeacon

visual-studio - 是否有适用于 Nunit 的免费 Visual Studio 插件?

configuration - ASP.NET Core 向 DI 注入(inject)服务公开配置