다른 프로젝트의 비공개 속성을 테스트해야하는 경우 Microsoft 단위 테스트 마법사가 접근 자 개체를 만듭니다. 내 단위 테스트 내에서 모든 단위 테스트 메서드에서 동일한 코드를 반복하지 않도록 도우미 함수를 만듭니다. 현재 하나의 표준 공용 객체를 사용하고 다른 하나는 접근 자 버전을 사용한다는 것을 제외하고는 거의 동일한 두 가지 테스트가 있습니다. 액세서는 공용 객체를 기반으로하므로 하나의 기능을 가질 수 있어야합니다. 나는 간단한 캐스트로 Generics를 사용할 수 있다고 생각했다. 그러나 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를 상속받습니다 (기본 클래스를 거친 후). – Josh