gpt4 book ai didi

c# - 为 if else 语句编写单元测试

转载 作者:行者123 更新时间:2023-12-02 16:16:29 29 4
gpt4 key购买 nike

我是单元测试的新手,也是 c# 的新手,非常感谢您提供有关如何编写单元测试以确保 AddGrade 方法中的逻辑正常工作的帮助。所以基本上,如果成绩为 >=0 且 <=100,那么成绩有效并且将被添加,其他任何内容都不是,它应该在控制台中显示错误。

我看过另一篇关于在 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);
}
}
}

最佳答案

我建议您修改您的 AddGrade()添加无效成绩时抛出异常的方法:

public void AddGrade(double grade)
{
if (grade >= 0 && grade <= 100)
{
grades.Add(grade);
}
else
{
throw new ArgumentException("grade must be between 0 and 100");
}
}

你可以这样测试:

[Fact]
public void BookGradeIsValid()
{
var book = new Book("");
Assert.Throws<ArgumentExeception>(() => book.AddGrade(101)); // should throw
Assert.Throws<ArgumentExeception>(() => book.AddGrade(-1)); // should throw
book.AddGrade(0); // should not throw
book.AddGrade(100); // should not throw
}

作为提示,不要使用 105 进行测试。直接在边界处使用一个值。如果你打错了,你写了if (grade >= 0 && grade <= 103)而不是 100,您不会通过测试意识到这一点。

使用异常有几个优点。首先,您可以使用 Book也在非控制台应用程序中上课。其次,如果出现问题,您可以进行自定义错误处理:

int grade = 300;
try
{
book.AddGrade(grade)
}
catch(ArgumentException)
{
// so many possibilities: log to console or display a MessageBox or
// send an e-mail to system admin or add grade with a default value or ...
}

此外,您不能忽略异常。如果您添加一个具有无效值的成绩,您的程序将停在那里,您不会想知道代码后面的 200 行,为什么缺少一个成绩。

关于c# - 为 if else 语句编写单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66545245/

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