Entity framework コードファーストでリレーションシップを設定した時に、ナビゲーション・プロパティを操作するコードのテスト用偽装リポジトリを書いてみました。
例は著者情報と本情報のエンティティで。
namespace TestBook.Models
{
public class Author
{
public int AuthorId { get; set; }
public string 著者名 { get; set; }
public virtual ICollection<Book> Books { get; set; }
}
}
namespace TestBook.Models
{
public class Book
{
public int BookId { get; set; }
public string タイトル { get; set; }
public DateTime 発刊日 { get; set; }
public int AuthorId { get; set; }
public virtual Author Author { get; set; }
}
}
リポジトリのインターフェイスはこんな感じになりますよね(とりあえず FindAuthor だけ)。
namespace TestBook.Models
{
public interface IBookRepository
{
IQueryable<Author> FindAutor();
}
}
それで、偽装リポジトリ。
using TestBook.Models;
namespace TestBook.Test.Models
{
class FakeBookRepository : IBookRepository
{
private IList<Author> _fakeAuthor = new List<Author> {
new Author {
AuthorId = 1,
著者名 = "著者1"
},
new Author {
AuthorId = 2,
著者名 = "著者2"
}
};
private IList<Book> _fakeBook = new List<Book> {
new Book {
BookId = 1,
タイトル = "タイトル1",
発刊日 = DateTime.Parse("2001/01/01"),
AuthorId = 1
},
new Book {
BookId = 2,
タイトル = "タイトル2",
発刊日 = DateTime.Parse("2001/01/15"),
AuthorId = 1
},
new Book {
BookId = 3,
タイトル = "タイトル3",
発刊日 = DateTime.Parse("2001/01/20"),
AuthorId = 2
}
};
public FakeBookRepository()
{
foreach (var n in _fakeAuthor)
{
n.Books = _fakeBook.Where(c => c.AuthorId == n.AuthorId).ToArray();
}
}
public IQueryable<Author> FindAutor()
{
return _fakeAuthor.AsQueryable();
}
}
}
何もしないと、ナビゲーションプロパティが null だと怒られちゃうので、コンストラクタで設定するだけですけど(笑)