【发布时间】:2021-06-07 05:52:37
【问题描述】:
我是单元测试新手,对 c# 也很陌生,非常感谢有关如何编写单元测试以确保 AddGrade 方法中的逻辑正常工作的一些帮助。所以基本上如果等级是 >=0 并且
我看过另一篇关于在 c# 中对 if-else 语句进行单元测试的帖子,并尝试从中解决这个问题,但老实说它让我感到困惑。我已经在网上四处查看,并尝试了很多不同的方法来尝试解决这个问题,但有时我发现很难将人们的示例应用到我的代码中,所以我认为最好只是发布我的代码并获得一些帮助,任何帮助都会不胜感激:)
我正在使用 Xunit 进行单元测试。该项目在控制台中运行。
这是带有main方法的程序类
using System;
using System.Collections.Generic;
namespace GradeBook
{
class Program
{
static void Main(string[] args)
{
var book = new Book("Dave's");
//add grade to the book
book.AddGrade(90.5);
book.AddGrade(80.5);
book.AddGrade(70.5);
book.AddGrade(60.5);
var stats = book.GetStatistics();
Console.WriteLine($"This Gradebooks name is {book.Name}");
Console.WriteLine($"The highest grade is {stats.High:N1}");
Console.WriteLine($"The lowest grade is {stats.Low:N1}");
Console.WriteLine($"The average grade is {stats.Average:N1}");//N1,N2 etc. is number of decimal places
}
}
}
这是我要为其编写单元测试的 AddGrade 方法所在的书类
using System;
using System.Collections.Generic;
namespace GradeBook
{
public class Book
{
public Book(string name)
{
grades = new List<double>();
Name = name;
}
public void AddGrade(double grade)
{
if (grade >= 0 && grade <= 100)
{
grades.Add(grade);
}
else
{
Console.WriteLine("Please enter a value between 0 and 100");
}
}
public Statistics GetStatistics()
{
var result = new Statistics();
result.Average = 0.0;
result.High = double.MinValue;
result.Low = double.MaxValue;
foreach (var grade in grades)
{
Console.WriteLine($"{Name} grade is: {grade}");
result.Low = Math.Min(grade, result.Low);
result.High = Math.Max(grade, result.High);
result.Average += grade;
}
result.Average /= grades.Count;
return result;
}
private List<double> grades = new List<double>() { };
public string Name;
}
}
这是统计类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GradeBook
{
public class Statistics
{
public double Average;
public double High;
public double Low;
}
}
这是我为此编写单元测试的地方
using System;
using System.Collections.Generic;
using Xunit;
namespace GradeBook.Tests
{
public class BookTests
{
[Fact]
public void BookGradeIsValid()
{
var book = new Book("");
book.AddGrade(105);
}
}
}
【问题讨论】:
-
欢迎来到单元测试的精彩世界!列表“等级”在哪里定义?它是否在 BookTests 范围内公开访问?
-
当你的代码很难测试时,很可能是因为它不是为了便于测试而编写的。在这里,我认为您对控制台的硬依赖是一个问题。你不能轻易地模拟控制台。因此,要么尝试通过返回指示成功与否的结果来完成代码中的控制台。改为抛出异常或使用具有可以模拟和干净测试的接口的不同类封装 Console。
标签: c# unit-testing if-statement xunit.net