我正在對以下方法進行單元測驗,并且希望ArgumentOutOfRangeException被拋出。而是gridTrading.GridLevels().As<double[]>()出于任何原因回傳 null 。它基本上吞下了例外。如何通過將回傳型別保持為IEnumerable<double>而不將其轉換為來修復它List<double>?順便說一句,我添加.As<double[]>()以防止多次列舉。
最后,你認為我試圖保留它是錯的IEnumerable<double>嗎?
[Fact]
public void GridLevels_ShouldThrow_WhenGivenInvalidGridType()
{
// Arrange
const double lowerLimit = 2000;
const double upperLimit = 10000;
const int gridCount = 4;
const int gridType = 4;
var gridTrading = new GridTrading(lowerLimit, upperLimit, gridCount, (GridType)gridType);
// Act
var action = new Action(() => gridTrading.GridLevels().As<double[]>());
// Assert
action.Should().Throw<ArgumentOutOfRangeException>().WithMessage("Grid type must be valid");
}
// The method I test
public IEnumerable<double> GridLevels()
{
switch (_gridType)
{
case GridType.Arithmetic:
foreach (var level in CalculateArithmetic())
{
yield return level;
}
break;
case GridType.Geometric:
foreach (var level in CalculateGeometric())
{
yield return level;
}
break;
default:
throw new ArgumentOutOfRangeException(nameof(_gridType), "Grid type must be valid");
}
IEnumerable<double> CalculateArithmetic()
{
var step = (_upperLimit - _lowerLimit) / _gridCount;
for (var i = 0; i <= _gridCount; i )
{
var price = _lowerLimit step * i;
yield return price;
}
}
IEnumerable<double> CalculateGeometric()
{
var step = Math.Pow(_upperLimit / _lowerLimit, 1.0 / _gridCount);
for (var i = 0; i <= _gridCount; i )
{
var price = _lowerLimit * Math.Pow(step, i);
yield return price;
}
}
}
我知道我可以制作 GridLevelsList<double>來代替IEnumerable<double>它,但我不想那樣做。
public List<double> GridLevels()
{
var list = new List<double>();
switch (_gridType)
{
case GridType.Arithmetic:
list.AddRange(CalculateArithmetic());
break;
case GridType.Geometric:
list.AddRange(CalculateGeometric());
break;
default:
throw new ArgumentOutOfRangeException(nameof(_gridType), "Grid type must be valid");
}
return list;
IEnumerable<double> CalculateArithmetic()
{
var step = (_upperLimit - _lowerLimit) / _gridCount;
for (var i = 0; i <= _gridCount; i )
{
var price = _lowerLimit step * i;
yield return price;
}
}
IEnumerable<double> CalculateGeometric()
{
var step = Math.Pow(_upperLimit / _lowerLimit, 1.0 / _gridCount);
for (var i = 0; i <= _gridCount; i )
{
var price = _lowerLimit * Math.Pow(step, i);
yield return price;
}
}
}
uj5u.com熱心網友回復:
你的GridLevels方法回傳一個惰性求值,除非你使用擴展方法IEnumerable<double>,否則 FA 永遠不會顯式列舉。Enumerating相反,您使用的是As擴展方法。那一個會嘗試將您的列舉轉換為double[],這是不可能的。在這種情況下,As將回傳default(double[]). 換句話說,您的代碼沒有被執行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/523260.html
上一篇:如何在單元測驗中模擬可觀察變數?
下一篇:如何單元測驗水線模型創建方法實體
