【发布时间】:2016-09-09 02:14:13
【问题描述】:
我正在尝试了解如何将 Moq 与 NUnit 和 IoC 一起使用。
(我在 BitBucket 中有完整的项目,但不知道如何共享它...) https://bitbucket.org/Cralis/skeleton/overview
我有一个我正在尝试测试的逻辑方法(登录)。它接受一个请求对象(具有用户名、密码和 IP 地址)。如果用户名和/或密码为空,则逻辑返回失败状态,并且不会进入数据访问层。
所以我正在创建一个单元测试来测试它。 (这是我第一次尝试嘲笑......)
public void NotNull_Returns_True()
{
// Arrange
var request = new LoginRequest { IPAddress = "1.1.1.1", Username = "dummy", Password = "dummy" };
var response = new LoginResponse { Request = request, Success = true, Message = "", UserID = 1 };
// Setup the moc data accessor, as we don't want to gop to the concrete one.
var MockedDataAccess = new Mock<IDataAccess>();
// Set it's return value
MockedDataAccess.Setup(x => x.Login(request)).Returns(response);
// Instantiate the Logic class we're testing, using a Moc data accessor.
var logic = new BusinessLogic(MockedDataAccess.Object);
// Act
var result = logic.Login(new LoginRequest { Password = "dummy", Username = "dummy", IPAddress = "1.1.1.1" });
// Assert
Assert.AreEqual(true, result.Success);
}
断言失败,因为 'result' 为 NULL。
我可能做错了很多。例如,我不确定为什么需要在顶部设置请求和响应对象,但是因为我找到的所有示例都是“字符串”和“整数”输入,所以我似乎无法使用 It.IsAny。 ..
有人可以帮助我理解这里吗?在断言中获得 NULL 作为结果,我做错了什么?我逐步完成,代码按预期执行。但结果为空,因为我从未调用数据访问器(它使用了模拟)。
编辑: 啊,
// Set it's return value
MockedDataAccess.Setup(x => x.Login(It.IsAny<LoginRequest>())).Returns(response);
这解决了问题。我不知道为什么,所以如果你能帮助我理解和重构它,让它像经验丰富的 Moq/UnitTester 期望的那样,那将非常有用。
【问题讨论】:
-
您的
Login方法有什么作用?它是否调用IDataAccess依赖项上的方法,如果这些方法返回 null,则返回 null? -
@BenRubin - 我添加了一个 Bitbucket 链接,因此您可以查看所有内容并进行克隆。但基本上,如果有空值发送到 BL 层,它会评估并返回一个成功标志为 False 的 Response 对象。它不应该返回一个空对象。
标签: c# unit-testing inversion-of-control moq