Moh*_*yan 2 c# unit-testing moq xunit.net asp.net-core
我编写了以下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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
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()));
}
}
}
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
如你所见,我说usersBusinessObjectMock必须回复true:
usersBusinessObjectMock
.Setup(service => service.ValidateUser(username, password))
.Returns(() => true);
Run Code Online (Sandbox Code Playgroud)
但var result = okObjectResult.Value as bool?;总是如此false
怎么了?
读完你的代码就像10分钟一样,因为这个错误很难找到.你把一切都做对了......
var okObjectResult = Assert.IsType<OkObjectResult>(actionResult);
var result = okObjectResult.Value as bool?;
Assert.True(result);
Run Code Online (Sandbox Code Playgroud)
但这是错误......
var是危险的...你的变量okObjectResult不是来自类型OkObjectResult ...这就是为什么你的断言永远不是真的......我相信你的意思是不要输入
Assert.IsType<OkObjectResult>(actionResult);
var okObjectResult = (OkObjectResult) actionResult;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
219 次 |
| 最近记录: |