gpt4 book ai didi

unit-testing - MS 单元测试示例

转载 作者:行者123 更新时间:2023-12-03 12:40:37 25 4
gpt4 key购买 nike

我正在努力解决单元测试问题。我一直在关注 Nerd 晚餐和专业 asp.net MVC 框架的示例,但是一旦我尝试自己的框架,我就会很快陷入困境。作为测试,我尝试构建一个验证类,该类仅使用登录信息 - 用户名和密码从存储库返回用户。我使用了这个例子,因为很容易想象一个人可能会执行什么测试:Is_Password_Valid、Is_Username_Valid 等。

我花了太长时间试图解决这个问题。任何人都可以提供一个示例,说明他们如何将其作为单元测试进行处理?我想一旦我破解了这个,我就会离开。

//Arrange
string email = "test@test.com";
string password = "test";

//Arrange
List<Customer> customer = new List<Customer>();

customer.Add(new Customer { CustomerId = 1, Email = email, Password = "best", FirstName = "test", LastName = "wods", Sex = true });
mockRepos = new Moq.Mock<ICustomerRepository>();
mockRepos.Setup(x => x.GetCustomerByPasswordUsername(email, password)).Returns(customer.First());
Authenticate auth = new Authenticate(mockRepos.Object);

//Act
var result = auth.Login(email, password);

//Assert
//this is where I start to become unstuck??????

最佳答案

看起来您确实走在正确的轨道上,但让我尝试解释一下我将如何进行测试。

这里实际的 system under test (SUT) 是 Authenticate 类。你还没有说太多,所以我假设如下:

它使用 ICustomerRepository 的实例根据用户名(电子邮件)和密码的组合来确定用户的存在。

当存储库返回 Customer 的实例时,给定用户名和密码组合, Login 方法返回 true。当存储库返回 null 时, Login 方法返回 false。

我将在下面使用这些假设,但如果它们不正确,我相信您将能够更改测试,以便它们对您的场景有意义。

测试 1:当用户名/密码组合正确时,Login 将返回 true

public void LoginWillReturnTrueForAValidUsernamePasswordCombination()
{
string email = "test@test.com";
string password = "test";

//Dummy customer
var customer = new Customer();

//Create mock
var mockRepos = new Moq.Mock<ICustomerRepository>();
mockRepos.Setup(x => x.GetCustomerByPasswordUsername(
It.Is<string>(s => s == email),
It.Is<string>(s => s == password))
.Returns(customer);

var auth = new Authenticate(mockRepos.Object);

//Act
var result = auth.Login(email, password);

//Assert
Assert.IsTrue(result);
}

注意 It.Is 的使用。基本上,模拟的设置方式是,当测试中定义的电子邮件和密码传递给 GetCustomerByPasswordUsername 方法时,它只会返回虚拟客户对象。

测试2:当用户名/密码组合不正确时,Login 将返回false
public void LoginWillReturnFalseForAnInvalidUsernamePasswordCombination()
{
string email = "test@test.com";
string password = "test";

//Create mock
var mockRepos = new Moq.Mock<ICustomerRepository>();
mockRepos.Setup(x => x.GetCustomerByPasswordUsername(
It.Is<string>(s => s == email),
It.Is<string>(s => s == password))
.Returns<Customer>(null);

var auth = new Authenticate(mockRepos.Object);

//Act
var result = auth.Login(email, password);

//Assert
Assert.IsFalse(result);
}

尽管通过上述测试进行了隐式测试,但您可能希望更进一步,编写一个测试以确保 Login 方法将正确的参数传递给存储库。这样的测试可能如下所示:

测试 3:登录将正确调用存储库
public void LoginWillInvokeGetCustomerByPasswordUsernameCorrectly()
{
string email = "test@test.com";
string password = "test";

//Create mock
var mockRepos = new Moq.Mock<ICustomerRepository>();
mockRepos.Setup(x => x.GetCustomerByPasswordUsername(
It.Is<string>(s => s == email),
It.Is<string>(s => s == password))
.Returns<Customer>(null)
.Verifiable();

var auth = new Authenticate(mockRepos.Object);

//Act (ignore result. We are only testing correct invocation)
auth.Login(email, password);

//Assert
mockRepos.Verify();
}

如果尚未调用已设置的方法,则模拟的 Verify 方法会引发异常。

我希望这有帮助。如果您还有其他问题,请随时提出。

关于unit-testing - MS 单元测试示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4422837/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com