0

これが私のクラスです:

public class AuditInfo
{
    public String ActionDescription { get; set; }
    public String ActionWho { get; set; }
    public BasicProjectProfile Project { get; set; }


    public AuditInfo ()
    { }

    public void SaveInfo ()
    {
        using (CIHEntities _dbContext = new CIHEntities())
        {
            AuditInfoEntity aie = new AuditInfoEntity();
            aie.ActionDescription = this.ActionDescription;
            aie.ActionWhen = DateTime.Now;
            if (this.ActionWho != null)
            {
                aie.ActionWho = this.ActionWho;
            }
            else
            {
                aie.ActionWho = "Not Specified";
            }
            aie.ProjectAssoc = _dbContext.ProjectEntity
                .Where(r => r.Id == this.Project.Id)
                .First();
            _dbContext.SaveChanges();
        }
    }
}

CIHEntitiesEntity Framework データベースです。

SaveInfo メソッドを単体テストしたいのですが、実際にはデータベースに保存すべきではありません。これはどのように行うことができますか?

ありがとう

エリック

4

3 に答える 3

0
Given : that Id don't know what is the interface of CIHEntities
When : Unit Test is required for AuditInfo.SaveInfo
Then : inject the interface of CIHEntities from constructor of AuditInfo
Then : create a mock of CIHEntities from its interface and use it for Unit Test

期待をモックし、モックライブラリ(Moqなど)を使用してSaveChangesが呼び出されたことを確認してください

于 2012-10-25T22:26:09.680 に答える
0

リポジトリ パターンを使用して、エンティティを保存する責任をリポジトリに移します。

public class AuditInfo
{
    public String ActionDescription { get; set; }
    public String ActionWho { get; set; }
    public BasicProjectProfile Project { get; set; }
}

リポジトリのインターフェイスを作成します。

public interface IRepository
{
    void Save();
}

次に、実装:

public RealRepository : IRepository
{
    public void SaveInfo ()
    {
        using (CIHEntities _dbContext = new CIHEntities())
        {
            AuditInfoEntity aie = new AuditInfoEntity();
            aie.ActionDescription = this.ActionDescription;
            aie.ActionWhen = DateTime.Now;
            if (this.ActionWho != null)
            {
                aie.ActionWho = this.ActionWho;
            }
            else
            {
                aie.ActionWho = "Not Specified";
            }
            aie.ProjectAssoc = _dbContext.ProjectEntity
                .Where(r => r.Id == this.Project.Id)
                .First();
            _dbContext.SaveChanges();
        }
    }
}

次に、リポジトリをパラメーターとして受け取るクライアントコードを次のようにします

public class MyClient{

    IRepository _repository;

    public MyClient(){
        _repository = new RealRepository();
    }

    public MyClient(IRepository repository)
    {
        _repository = repository;
    }

    public void Main(){
         AuditInfo entity = new AuditInfo();
         //do whatever you want
         _repository.Save();
    }
}

実際のアプリケーションでは、RealRepository を使用するデフォルトのコンストラクターを使用できますが、単体テストでは、データベースと対話しない偽のリポジトリ実装を渡すことができます (または、Moq のようなモッキング フレームワークを使用することをお勧めします)。

これは基本的な概念です。これを改善して汎用リポジトリを作成し、UoW パターンを使用することができます。詳細については、この msdn 記事: Testability and EF を参照してください。

于 2012-10-25T22:30:24.730 に答える
0

TransactionScopeを使用します。実際に変更をコミットしない限り、データベースには追加されません。これは私が単体テストで使用しているもので、問題なく動作します。

これを使用するには、System.Transactions への参照を追加する必要があります。その後、Windows エラーが発生する場合があります。私の記憶が正しければ、いくつかの Windows サービスを開始する必要があります。

于 2012-10-26T12:40:02.257 に答える