如果您需要從另一個項目中測試非公共屬性,Microsoft單元測試嚮導會創建Accessor對象。在我的單元測試中,我創建了輔助函數,這樣我就不會在每個單元測試方法中重複相同的代碼。目前我有兩個幾乎完全相同的測試,除了一個採用標準公共對象,另一個採用Accessor版本。由於Accessor基於公共對象,所以我應該能夠擁有一個功能。我曾假設我可以使用泛型來完成一個簡單的演員。但在posting the question之後,我發現還有很多工作要做,包括必須更新底層對象。我的問題是另一種方法來減少這些冗餘方法只有一個功能使用鑄造(或其他)的方法?最佳方式更新使用共享函數的兩個常用函數
下面是現有的兩個功能:
// Common function to create a new test record with standard Account object
internal static void CreateAccount(out Account account, bool saveToDatabase)
{
DateTime created = DateTime.Now;
string createdBy = _testUserName;
account = new Account(created, createdBy);
account.Notes = Utilities.RandomString(1000);
if (saveToDatabase)
account.Create();
}
// Common function to create a new test record with Account_Accessor
internal static void CreateAccount(out Account_Accessor account, bool saveToDatabase)
{
DateTime created = DateTime.Now;
string createdBy = _testUserName;
account = new Account_Accessor(created, createdBy);
account.Notes = Utilities.RandomString(1000);
if (saveToDatabase)
account.Create();
}
我有這些單元測試的兩打和真實對象有10個屬性的平均值,我在這裏簡單的例子。
下面是單元測試API創建的訪問器代碼(再次,我已經降低下來,以簡化的例子):
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using System.Collections.ObjectModel;
using System.Data;
namespace NameHere.Bll
{
[Shadowing("NameHere.Bll.Account")]
public class Account_Accessor : ProjectBase_Accessor<Account>
{
protected static PrivateType m_privateType;
public Account_Accessor(PrivateObject value);
[Shadowing("[email protected]")]
public Account_Accessor(DateTime created, string createdBy);
[Shadowing("_notes")]
public string _notes { get; set; }
public static Account_Accessor AttachShadow(object value);
[Shadowing("[email protected]")]
public override void Create();
}
}
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using System.ComponentModel;
using System.Linq.Expressions;
namespace NameHere.Bll
{
[Shadowing("NameHere.Bll.ProjectBase`1")]
public class ProjectBase_Accessor<T> : BaseShadow, INotifyPropertyChanged
{
protected static PrivateType m_privateType;
public ProjectBase_Accessor(PrivateObject value);
[Shadowing("Created")]
public DateTime Created { get; set; }
public static PrivateType ShadowedType { get; }
[Shadowing("[email protected]")]
public void add_PropertyChanged(PropertyChangedEventHandler value);
public static ProjectBase_Accessor<T> AttachShadow(object value);
[Shadowing("[email protected]")]
public virtual void Create();
}
}
'Account'和'Account_Accessor'之間的區別是什麼? –
無視我的答案。因爲這顯然與你的其他問題的答案完全相同。 http://stackoverflow.com/a/12998986/2009。換句話說,我認爲泛型實際上是你用最少的工作量來完成的方法。 – hometoast
我在我的問題中添加了代碼訪問器代碼,正如@dthorpe指出的那樣,Accessor繼承自BaseShadow(在它通過我們的Base類之後)。 – Josh