Entity framework コードファーストでリレーションシップを張った時のテスト用偽装リポジトリ

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 だと怒られちゃうので、コンストラクタで設定するだけですけど(笑)


コメントを残す

メールアドレスが公開されることはありません。