如何:通过控制台捕获 void 方法的输出?
How to: capture output from void method through the console?
我正在为质数程序编写测试用例。我正在尝试将我的 PrimeEvaluator
方法的输出与我的 expectedFactors1
字符串进行比较。 PrimeEvaluator
是一个 void,所以这就是我尝试从控制台读取输出的原因。
public void PrimeTest()
{
//arange
int number = 738;
string expectedFactors1 = "2,3,3,41";
string actual;
//act
Primes.Program.PrimeEvaluator( number);
actual = Console.ReadLine();
//assert
Assert.AreEqual(expectedFactors1,actual);
}
当我 运行 我的单元测试没有任何反应。我知道这可能是错误的,但是有人可以给我一些关于如何从 PrimeEvaluator
?
捕获数字输出的见解吗?
只需让您的 PrimeEvaluator 方法 return 成为一个整数列表。然后你可以比较输出而不必解析控制台,这绝不是一个好主意。以下是如何将方法更改为 return 整数列表:
private static List<int> PrimeEvaluator(int number)
{
var result = new List<int>();
// Take out the 2s
while (number % 2 == 0)
{
result.Add(2);
number /= 2;
}
// take out other primes
int factor = 3;
while (factor * factor <= number)
{
if (number % factor == 0)
{
result.Add(factor);
number /= factor;
}
else
factor += 2;
}
// if num is not 1, then whatever is left is prime.
if (number > 1) result.Add(number);
return result;
}
然后在你的单元测试中调用它(你有两种方法可以比较):
List<int> primeFactorsList = PrimeEvaluator(738); // list variant
string primeFactorsString = string.Join(", ", primeFactorsList); // string variant
其中 return 是一个包含 4 个整数的列表:2、3、3、41
现在您的代码可以在库中重复使用,无需依赖控制台输出来获取答案。
附带说明一下,请查看 .Net 中的 System.Math 代码,了解 Microsoft 如何实现可用的数学运算,源代码可用:System.Math
在这种特殊情况下,您可以利用 Console.Out
using Console.SetOut()
拦截写入的内容。
public void PrimeTest() {
//stream and writer used to intercept console output
using(var memoryStream = new MemoryStream()) {
var writer = new StreamWriter(memoryStream);
Console.SetOut(writer);
//Arrange
int number = 738;
string expectedFactors1 = "2, 3, 3, 41";
//Act
Primes.Program.PrimeEvaluator(number);
//Assert
memoryStream.Position = 0; //reset position to read stream
string actual = new StreamReader(memoryStream).ReadToEnd();
Assert.AreEqual(expectedFactors1, actual);
}
}
我正在为质数程序编写测试用例。我正在尝试将我的 PrimeEvaluator
方法的输出与我的 expectedFactors1
字符串进行比较。 PrimeEvaluator
是一个 void,所以这就是我尝试从控制台读取输出的原因。
public void PrimeTest()
{
//arange
int number = 738;
string expectedFactors1 = "2,3,3,41";
string actual;
//act
Primes.Program.PrimeEvaluator( number);
actual = Console.ReadLine();
//assert
Assert.AreEqual(expectedFactors1,actual);
}
当我 运行 我的单元测试没有任何反应。我知道这可能是错误的,但是有人可以给我一些关于如何从 PrimeEvaluator
?
只需让您的 PrimeEvaluator 方法 return 成为一个整数列表。然后你可以比较输出而不必解析控制台,这绝不是一个好主意。以下是如何将方法更改为 return 整数列表:
private static List<int> PrimeEvaluator(int number)
{
var result = new List<int>();
// Take out the 2s
while (number % 2 == 0)
{
result.Add(2);
number /= 2;
}
// take out other primes
int factor = 3;
while (factor * factor <= number)
{
if (number % factor == 0)
{
result.Add(factor);
number /= factor;
}
else
factor += 2;
}
// if num is not 1, then whatever is left is prime.
if (number > 1) result.Add(number);
return result;
}
然后在你的单元测试中调用它(你有两种方法可以比较):
List<int> primeFactorsList = PrimeEvaluator(738); // list variant
string primeFactorsString = string.Join(", ", primeFactorsList); // string variant
其中 return 是一个包含 4 个整数的列表:2、3、3、41
现在您的代码可以在库中重复使用,无需依赖控制台输出来获取答案。
附带说明一下,请查看 .Net 中的 System.Math 代码,了解 Microsoft 如何实现可用的数学运算,源代码可用:System.Math
在这种特殊情况下,您可以利用 Console.Out
using Console.SetOut()
拦截写入的内容。
public void PrimeTest() {
//stream and writer used to intercept console output
using(var memoryStream = new MemoryStream()) {
var writer = new StreamWriter(memoryStream);
Console.SetOut(writer);
//Arrange
int number = 738;
string expectedFactors1 = "2, 3, 3, 41";
//Act
Primes.Program.PrimeEvaluator(number);
//Assert
memoryStream.Position = 0; //reset position to read stream
string actual = new StreamReader(memoryStream).ReadToEnd();
Assert.AreEqual(expectedFactors1, actual);
}
}