簡體   English   中英

單元測試失敗 AreEquals() 和 ToString()

[英]Unit test fails AreEquals() and ToString()

我的主要方法是:

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);

       }
   }
}

您的代碼有兩個問題。

  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 ,但這些實際上是相同的數字。 您的測試必須通過引入分數歸一化或以不同的方式進行比較來處理這種差異。


最后我有一些tips:

  1. 使 Rational 類型成為只讀的不可變struct
  2. 實現不改變現有值而是計算結果並將結果作為新的 Rational 值返回的適當運算符
  3. 添加對歸一化的支持,這通常通過將分子和分母除以 GCD 值來完成,並確保最多只有分子是負數(沒有負分母)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM