0

別のプロジェクトの非パブリック プロパティをテストする必要がある場合、Microsoft Unit Test Wizard は Accessor オブジェクトを作成します。ユニット テスト内でヘルパー関数を作成して、すべてのユニット テスト メソッドで同じコードを繰り返さないようにしています。現在、1 つは標準のパブリック オブジェクトを使用し、もう 1 つは Accessor バージョンを使用することを除いて、ほぼ同じ 2 つのテストがあります。アクセサーは標準版をベースにしているので、ひとつの機能を持たせることができるはずです。

Generics を使用して単純なキャストを実行できると想定していました。しかし、質問を投稿した後、基になるオブジェクトを更新する必要があるなど、もっと多くの作業が必要であることがわかりました。これは、他のアプローチが存在するかどうかを尋ねたときに確認されました。動的オブジェクトが機能する可能性があることが示唆されました。私は動的オブジェクトに精通していません.誰かが私が1つの共有関数を持ち、実行時にオブジェクトを決定できるようにする例を投稿できますか?

既存の 2 つの関数は次のとおりです。

// 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();
}

これらの単体テストは 20 個あり、実際のオブジェクトには平均 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(".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();
    }
}
4

1 に答える 1

0

ここでは、動的オブジェクトを使用した共有関数の最初の試みです。ブール値の 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();
}

このアプローチに関する提案やコメントはありますか?

于 2012-10-26T01:07:13.917 に答える