如果需要测试另一个项目中的非公共属性,则Microsoft单元测试向导会创建访问器对象。在我的单元测试中,我创建助手函数,这样我就不会在每个单元测试方法中重复相同的代码。目前,我有两个几乎相同的测试,除了一个采用标准公共对象,另一个采用访问器版本。因为存取器是基于标准版本的,所以我应该可以有一个函数。
我曾假设我可以使用泛型通过简单的强制转换来完成。但在posting the question之后,我发现还有更多的工作要做,包括必须更新底层对象。当我询问是否存在其他方法时,这一点得到了证实。有人建议Dynamic objects might work。我不熟悉动态对象,有没有人可以发布一个示例,让我拥有一个共享函数,并在运行时确定该对象?
下面是现有的两个函数:
// Common function to create a new test record with standard Account object
internal static Account CreateAccount(bool saveToDatabase)
{
DateTime created = DateTime.Now;
string createdBy = _testUserName;
Account 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 Account_Accessor CreateAccount(bool saveToDatabase)
{
DateTime created = DateTime.Now;
string createdBy = _testUserName;
Account_Accessor account = new Account_Accessor(created, createdBy);
account.Notes = Utilities.RandomString(1000);
if (saveToDatabase)
account.Create();
}我有24个这样的单元测试,真实的对象平均有10个属性,我在这里简化了示例。
下面是Unit Test 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(".ctor@2")]
public Account_Accessor(DateTime created, string createdBy);
[Shadowing("_notes")]
public string _notes { get; set; }
public static Account_Accessor AttachShadow(object value);
[Shadowing("Create@0")]
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("add_PropertyChanged@1")]
public void add_PropertyChanged(PropertyChangedEventHandler value);
public static ProjectBase_Accessor<T> AttachShadow(object value);
[Shadowing("Create@0")]
public virtual void Create();
}
}发布于 2012-10-26 09:07:14
这是我第一次尝试使用动态对象来实现共享函数。它根据布尔useAccessor参数返回Account或Account_Accessor:
internal static dynamic CreateAccount(bool saveToDatabase, bool useAccessor)
{
DateTime created = DateTime.Now;
string createdBy = _testUserName;
dynamic account;
if (useAccessor)
account = new Account_Accessor(created, createdBy);
else
account = new Account(created, createdBy);
account.Notes = Utilities.RandomString(1000);
if (saveToDatabase)
account.Create();
}对这种方法有什么建议或评论吗?
https://stackoverflow.com/questions/13077838
复制相似问题