那麼,你可以將你的fullNameValue字段修改爲下面的代碼。我認爲這會解決你的錯誤。
問題似乎是您的fullNameValue字段的初始化代碼引用了Data屬性(Data["FirstName"]
),但Data是實例屬性,而不是靜態屬性,因此您無法在靜態上下文中引用它(即當初始化靜態字段時)。
static object _syncLock = new object();
static string _fullNameValue;
string fullNameValue
{
get
{
lock (_syncLock)
{
if (_fullNameValue == null)
{
_fullNameValue = UniqueIdGenerator.GenerateUniqueId(Convert.ToInt32(Data["FirstName"]));
}
return _fullNameValue;
}
}
}
它看起來像你用這個單元測試的目的。在這種情況下,它看起來像這樣的代碼將爲fullNameValue生成一個值,並將在所有測試用例中重用該值。
如果這就是你想要的,那麼這就好了。但是,我的猜測是,如果您開始爲不同的測試使用不同的測試數據,您可能會發現此代碼的行爲不正確,儘管我對ArtOfTest框架並不熟悉。如果這給您帶來麻煩,那麼您可能需要重新考慮_fullNameValue字段是否應爲static
。
此外,作爲在評論中討論的那樣,你可以使fullNameValue場是非靜態的,然後在構造函數初始化。下面是代碼:
string fullNameValue;
string companyValue;
public PricingForm()
{
fullNameValue = UniqueIdGenerator.GenerateUniqueId(Convert.ToInt32(Data["FirstName"]));
companyValue = // code to initialize company value
}
另一種替代方案:你可能想嘗試fullNameValue字段轉換爲一個屬性。同樣,這可能會產生與上述示例不同的行爲。即使輸入參數相同,每次對GenerateUniqueId的調用都返回不同的值嗎?那就意味着每次你訪問這個屬性時你都會得到一個不同的值,所以考慮這是否是你想要的。
string fullNameValue
{
get { return UniqueIdGenerator.GenerateUniqueId(Convert.ToInt32(this.Data["FirstName"])); }
}
在註釋中的討論,我的建議是使用如下所示的方法。
這會執行_fullNameValue字段的延遲初始化(由於BaseWebAiiTest類的Data屬性在構造函數執行時未初始化,因此似乎是必需的)。我遺漏了鎖定代碼,因爲它可能不是必需的,OP表達了對它冗長的擔心。
string _fullNameValue;
string fullNameValue
{
get
{
if (_fullNameValue == null)
_fullNameValue = UniqueIdGenerator.GenerateUniqueId(Convert.ToInt32(this.Data["FirstName"]));
return _fullNameValue;
}
}
這是不是導致錯誤的代碼。 – 2012-01-04 14:36:12
也許我在這裏錯過了一些東西,但是你得到的錯誤引用了一個'Data'屬性。從該屬性發布代碼。 – MusiGenesis 2012-01-04 14:37:06
public BaseWebAiiTest.TestData Data {get; } – algot 2012-01-04 14:42:50