【问题标题】:Unit test fails AreEquals() and ToString()单元测试失败 AreEquals() 和 ToString()
【发布时间】:2022-02-04 08:34:26
【问题描述】:

我的主要方法是:

using System;
namespace Rational
{
   public class Rational
   {
       public int Denom { get; private set; }
       public int Numer { get; private set; }
       public Rational(int numerator = 0, int denominator = 1)
       {
           Denom = denominator;
           Numer = numerator;
       }
       public void IncreaseBy(Rational num)
       {
           Numer = Numer * num.Denom + num.Denom * Denom;
           Denom = Denom * num.Denom;
       }
       public void DecreaseBy(Rational num)
       {
           Numer = Numer * num.Denom - num.Denom * Denom;
           Denom = Denom * num.Denom;
       }
       override public String ToString() { return (Numer + "/" + Denom); }
   }

调用我的方法的程序是:

using System;
namespace Rationals
{
   public class Rationals

   {

       class Program
       {
           static void Main(string[] args)
           {
               Rational num1 = new Rational(10, 8);
               Rational num2 = new Rational(8, 10);
               Console.WriteLine("1st number is:   " + num1);
               Console.WriteLine("2nd number is:   " + num2);
               num1.IncreaseBy(num2);
               Console.WriteLine("1st number + 2nd number = " + num1);
               num1.DecreaseBy(num2);
               Console.WriteLine("1st number - 2nd number = " + num2);
           }
       }
   }
}

我必须编写一个单元测试来测试我的IncreaseBy() 以及我的DecreaseBy(),最后是ToString()。有人可以帮帮我吗!!!?

这是我迄今为止在 UnitTest 中所拥有的,请尽可能多地废话。我无法使测试通过它不断出现不同的答案而且 ToString() 会引发错误。

using Microsoft.VisualStudio.TestTools.UnitTesting;
using Rationals_123456789;

namespace ratonalstest
{
   [TestClass]
   public class UnitTest1
   {
       [TestMethod]
       public void DecreaseByTest()
       {
           int num = 1, den = 6, num1 = 2, den1 = 9;
           Rational fraction1 = new Rational(num, den);
           Rational fraction2 = new Rational(num1, den1);
           Rational expectedFraction = new Rational(-1, 18);

           //when
           fraction1.DecreaseBy(fraction2);

           //then
           Assert.AreEqual(fraction1.Numer, expectedFraction.Numer);
           Assert.AreEqual(fraction1.Denom, expectedFraction.Denom);

       }
       [TestMethod]
       public void IncreaseByTest()
       {
           int num = 1, den = 4, num1 = 1, den1 = 4;
           Rational fraction1 = new Rational(num, den);
           Rational fraction2 = new Rational(num1, den1);

           Rational expectedFraction = new Rational(7, 18);

           //when
           fraction1.IncreaseBy(fraction2);

           //then
           Assert.AreEqual(fraction1.Numer, expectedFraction.Numer);
           Assert.AreEqual(fraction1.Denom, expectedFraction.Denom);

           //when
           fraction1.DecreaseBy(fraction2);

           //then
           Assert.AreEqual(fraction1.Numer, expectedFraction.Numer);
           Assert.AreEqual(fraction1.Denom, expectedFraction.Denom);

       }

       [TestMethod]
       public void ToString()
       {
           int num = 1, den = 6, num1 = 2, den2 = 9;
           Rational fraction1 = new Rational(num, den);
           Rational fraction2 = new Rational(num1, den2);

           string expectedString = "1/6";
           string outputString = fraction1.ToString();

          //then
           Assert.AreEqual(expectedString, outputString);

       }
   }
}

【问题讨论】:

  • 您遇到什么错误? Alsno 绝不是在您的测试中“废话”,但 IncreaseBy 测试不应该测试超过 1 件事 - 这是单元测试的常用标准
  • 不应该这部分和它的负兄弟Numer * num.Denom + num.Denom * Denom添加num.Numer而不是num.Denom,所以它应该是Numer * num.Denom + num.Numer * Denom

标签: c# unit-testing mstest


【解决方案1】:

您的代码有两个问题。

  1. 你计算的结果错误
  2. 您没有对分数进行归一化

第一个问题是这两个表达式:

Numer = Numer * num.Denom + num.Denom * Denom;
Numer = Numer * num.Denom - num.Denom * Denom;

应该使用num.Numer 而不是num.Denom 所以这些是正确的:

Numer = Numer * num.Denom + num.Numer * Denom;
Numer = Numer * num.Denom - num.Numer * Denom;

现在,这仍然不会使您的测试通过,但现在让我们试试您的代码:

Rational fraction1 = new Rational(1, 6);
Rational fraction2 = new Rational(2, 9);

fraction1.DecreaseBy(fraction2);
Console.WriteLine(fraction1.ToString());

这个输出:

-3/54

您的测试需要-1/18,但实际上它们是相同的数字。您的测试必须通过引入分数归一化或以不同的方式进行比较来处理这种差异。


最后我有一些提示:

  1. 将 Rational 类型设为只读不可变 struct
  2. 实现不改变现有值而是计算结果并将结果作为新的 Rational 值返回的适当运算符
  3. 添加对归一化的支持,这通常通过将分子和分母除以 GCD 值来完成,并确保最多只有分子是负数(没有负分母)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 2021-12-15
    相关资源
    最近更新 更多