gpt4 book ai didi

c# - 如何对依赖于控制台的 switch 语句进行单元测试

转载 作者:太空宇宙 更新时间:2023-11-03 19:19:37 25 4
gpt4 key购买 nike

我是单元测试的新手,我正在使用 VS 2010 单元测试框架。

我有一个函数可以从用户那里获取一个整数,然后根据用户输入执行不同的函数。我已经阅读了很多关于单元测试的内容,但是我还没有找到任何可以告诉我如何测试 switch 语句的每个分支的内容。到目前为止我得到了什么:

    [TestMethod]
public void RunBankApplication_Case1()
{
using (var sw = new StringWriter())
{
using (var sr = new StringReader("1"))
{
Console.SetOut(sw);
Console.SetIn(sr);
BankManager newB = new BankManager();
newB.RunBankApplication();
var result = sw.ToString();

string expected = "Enter Account Number: ";
Assert.IsTrue(result.Contains(expected));
}
}
}

当调用案例 1 下的函数时,首先发生的事情是将字符串“Enter Account Number:”写入控制台。但是,这根本不起作用。我没有正确地将输入传递给控制台吗?感谢您的帮助!

编辑:我的 RunBankApplication() 函数:

do
{
DisplayMenu();

option = GetMenuOption();

switch (option)
{
case 1:
if (!CreateAccount())
{
Console.WriteLine("WARNING: Could not create account!");
}
break;
case 2:
if (!DeleteAccount())
{
Console.WriteLine("WARNING: Could not delete account!");
}

break;
case 3:
if (!UpdateAccount())
{
Console.WriteLine("WARNING: Could not update account!");
}

break;
case 4: DisplayAccount();
break;
case 5: status = false;
break;
default: Console.WriteLine("ERROR: Invalid choice!");
break;
}
} while (status);

最佳答案

我想您的 RunBankApplication 看起来与此类似:

public void RunBankApplication()
{
var input = Console.ReadLine();
switch (input)
{
case "1":
Console.WriteLine("Enter Account Number: ");
break;
case "2":
Console.WriteLine("Hello World!");
break;
default:
break;
}
}

要了解您对 Console 的固定依赖性,这会使您的方法无法测试,您应该在构造函数中注入(inject)此依赖性。

你需要一个接口(interface)来定义你的依赖:

public interface IConsoleService
{
string ReadLine();
void WriteLine(string message);
}

您为它创建一个默认实现:

public class ConsoleService : IConsoleService
{
public string ReadLine()
{
return Console.ReadLine();
}

public void WriteLine(string message)
{
Console.WriteLine(message);
}
}

然后您将此实现注入(inject)您的 BankManager 类并在类中使用它:

public class BankManager
{
private IConsoleService _consoleService;

public BankManager(IConsoleService consoleService)
{
_consoleService = consoleService;
}

public void RunBankApplication()
{
var input = _consoleService.ReadLine();
switch (input)
{
case "1":
_consoleService.WriteLine("Enter Account Number: ");
break;
case "2":
_consoleService.WriteLine("Hello World!");
break;
default:
break;
}
}
}

现在您可以在测试中模拟这种依赖关系。 Moq是这样一个模拟库的不错选择:

[TestClass]
public class UnitTest1
{
[TestMethod]
public void GetMessage_Input1_ReturnEnterAccountNumberMessage()
{
var consoleService = new Mock<IConsoleService>();
consoleService.Setup(c => c.ReadLine()).Returns("1");

var bankManager = new BankManager(consoleService.Object);
bankManager.RunBankApplication();

consoleService.Verify(c => c.WriteLine("Enter Account Number: "), Times.Once());
}

[TestMethod]
public void GetMessage_Input2_ReturnHelloWorldMessage()
{
var consoleService = new Mock<IConsoleService>();
consoleService.Setup(c => c.ReadLine()).Returns("2");

var bankManager = new BankManager(consoleService.Object);
bankManager.RunBankApplication();

consoleService.Verify(c => c.WriteLine("Hello World!"), Times.Once());
}
}

当然,对于这样一个简单的示例来说,这有点矫枉过正,但这种方法在大型项目中确实很有用。作为下一步,您可以使用 IoC container在应用程序中自动注入(inject)您的依赖项。

关于c# - 如何对依赖于控制台的 switch 语句进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13405250/

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