我正在寫一些N-Unit測試,而且我有點困難。我試圖在我的代碼中將Test連接到TestCaseSource
,但它似乎沒有正確構建對象。N-Unit中的TestCaseSource
這裏是我的測試方法:
[Test, TestCaseSource(typeof(TestCaseStuff), "GetTestCases", Category = "Release")]
public void WithdrawMoney(TestCaseStuff tc)
{
double newBalance = AccountBalance - tc.amt;
if (newBalance < 0)
{
Assert.Fail(String.Format("You can't withdraw {0}! You've maxed" +
"out your bank account.", tc.amt.ToString("C2")));
}
AccountBalance = newBalance;
Assert.Pass(String.Format("Your new balance is {0}.",
(AccountBalance).ToString("C2")));
}
而且我TestCaseSource
:
public class TestCaseStuff
{
public double amt { get; set; }
public TestCaseStuff()
{
Random rnd = new Random();
this.amt = rnd.Next(0, 20);
}
[Category("Release")]
public IEnumerable<TestCaseData> GetTestCases()
{
for (int i = 0; i < 500; i++)
{
yield return new TestCaseData(this);
}
}
}
的主要是作爲概念驗證,這樣,當它的時間來寫複雜的實際測試對象,我會知道我可以只寫一個上面的循環,並將隨機值放入我的對象中。但是,返回到我的測試方法的TestCaseStuff
的每個實例都是相同的。
更新:
下面的答案是正確的。當我將它傳遞給N-Units TestCaseData
對象時,我認爲(錯誤地)它只是簡單地按值傳遞該實例。顯然,它是通過引用完成的,這就是爲什麼值總是相同的原因。
最重要的是,我錯誤地使用了Random
類。這不是我經常處理的事情,但我沒有正確地閱讀它。正如下面的鏈接中所解釋的,當使用Random
以及它的默認構造函數時,種子值是從系統時鐘派生的。因此,如果您快速連續實例化幾個Random
對象,它們將共享相同的默認種子值並生成相同的值。
因此,作爲這些發展的結果,我的代碼,原先爲:
public class TestCaseStuff
{
public double amt { get; set; }
private static readonly Random rnd = new Random();
public TestCaseStuff()
{
this.amt = rnd.Next(0, 20);
}
[Category("Release")]
public IEnumerable<TestCaseData> GetTestCases()
{
for (int i = 0; i < 500; i++)
{
yield return new TestCaseData(new TestCaseStuff());
}
}
}
是的,那就是我最終做的。我認爲TestCaseData在我傳入'this'時會有它自己的TestCaseStuff副本,但我顯然錯了。 – elucid8