私は(かなり)TDDを初めて使っていますので、やさしくしてください!ID列のモックデータベース
私はCodeFirstを使用して、VBS2015コミュニティのEF6を使用してC#でアプリケーションを作成しています。
データアクセスのために作成されたインターフェイスがあり、ユニットテストのためにメモリ内にモックデータベースを作成できます。
私のモデルの各ID(例えば、ユーザID)と命名された一意の識別子列があり
[OK]を、私は私のモックデータベースにレコードを追加するときに、私はそれがために新しいID値を作成してもらう必要があります私はこれを後のコードで参照しています。各テーブルに一意のID列がある場合、これを汎用セットでどのように行うのですか?私は独立して各テーブルをモックする必要がありますか?
私のデータベースインタフェースは、次のようになります。
Namespace Labinator2016.Lib.Headers
{
using System;
using System.Collections.Generic;
using System.Linq;
public interface ILabinatorDb : IDisposable
{
IQueryable<T> Query<T>() where T : class;
void Add<T>(T entity) where T : class;
void Delete<T1>(System.Linq.Expressions.Expression<Func<T1, bool>> target) where T1 : class;
void Remove<T>(T entity) where T : class;
void Update<T>(T entity) where T : class;
void SaveChanges();
}
}
私のモックデータベースは、その後、次のようになります。
namespace Labinator2016.Tests.TestData
{
using System;
using System.Collections.Generic;
using System.Linq;
using Lib.Headers;
using Labinator2016.Lib.Models;
class FakeDatabase : ILabinatorDb
{
public IQueryable<T> Query<T>() where T : class
{
return this.Sets[typeof(T)] as IQueryable<T>;
}
public void Dispose() { }
public void AddSet<T>(IQueryable<T> objects)
{
this.Sets.Add(typeof(T), objects);
}
public void Add<T>(T entity) where T : class
{
this.Added.Add(entity);
IQueryable<T> temp = this.Sets[typeof(T)] as IQueryable<T>;
List<T> existing = temp.ToList();
existing.Add(entity);
Sets[typeof(T)] = existing;
}
void ILabinatorDb.Delete<T1>(System.Linq.Expressions.Expression<Func<T1, bool>> Target)
{
}
public void Update<T>(T entity) where T : class
{
this.Updated.Add(entity);
}
public void Remove<T>(T entity) where T : class
{
this.Removed.Add(entity);
}
public void SaveChanges()
{
this.saved++;
}
public Dictionary<Type, object> Sets = new Dictionary<Type, object>();
public List<object> Added = new List<object>();
public List<object> Updated = new List<object>();
public List<object> Removed = new List<object>();
public int saved = 0;
}
}
現在
、私は、ユーザーテーブルからユーザーオブジェクトを取得するいくつかのコードを持っているベース名前で存在しない場合は、最初に作成されます。私のコードは以下の通りです:
User existingUser = this.db.Query<User>().Where(u => u.UserName == newUserName).FirstOrDefault();
if (existingUser == null)
{
User userToAdd = new User();
userToAdd.UserName = newUserName;
userToAdd.Password = PasswordHash.CreateHash("password");
this.db.Add<User>(userToAdd);
this.db.SaveChanges();
existingUser = this.db.Query<User>().Where(u => u.EmailAddress == nu).FirstOrDefault();
}
私のアプリケーションでは間違ったアプローチを使用していますか、この機能を模擬する方法はありますか?