【发布时间】:2018-04-28 19:37:10
【问题描述】:
我编写了以下 XUnit 测试来测试 .Net Core WebApi 控制器的操作:
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);
}
}
}
AccountController:
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
怎么了?
【问题讨论】:
-
如果你只是将值转换为布尔值会发生什么,即
var result = (bool) okObjectResult.Value; -
@Nkosi:结果总是错误的,请参阅主帖图片中的观看部分
-
我们专注于错误的事情。模拟未正确配置,因此未按预期运行。检查我提供的答案。
标签: c# unit-testing asp.net-core moq xunit.net