2017-12-22 23 views
0

ユニットテストを実行しようとしていて、[TestInitialize]を実行する必要があります。機能がライブで動作しているが、ユニットテスト中ではない

this postで情報が見つかりました。私には意味がないので、それを修正する方法はわかりません。

[TestInitialize] 
public void TestInitialize() 
{ 
    mock = new Mock<ILibraryRepository>(); 

    books = new List<Book>() 
    { 
     new Book { Id = 0, Title = "Title 0", Edition = 0, PublicationDate = DateTime.Now, Author = { Id = 0, Name = "Author 0", DateOfBirth = DateTime.Now, DateOfDeath = DateTime.Now }, AuthorId = 0 }, 
     new Book { Id = 1, Title = "Title 1", Edition = 1, PublicationDate = DateTime.Now, Author = { Id = 1, Name = "Author 1", DateOfBirth = DateTime.Now, DateOfDeath = DateTime.Now }, AuthorId = 1 }, 
     new Book { Id = 2, Title = "Title 2", Edition = 2, PublicationDate = DateTime.Now, Author = { Id = 2, Name = "Author 2", DateOfBirth = DateTime.Now, DateOfDeath = DateTime.Now }, AuthorId = 2 } 
    }; 

    mock.Setup(m => m.Books).Returns(books.AsQueryable()); 

    var controller = new BooksController(mock.Object); 
} 

これはすべて上手く見えます。私はこのテストを実行する場合でも:

[TestMethod] 
public void IndexLoadsValid() 
{ 
    // Arrange 
    var controller = new BooksController(mock.Object); 

    // Act 
    var result = controller.Index() as ViewResult; 

    // Assert 
    Assert.IsNotNull(result); 
} 

を私は次のエラーを取得:

object reference not set to an instance of an object

をそして、これは明らかです。それはnullです。しかし、私が理解できないのはなぜですか?

デバッグは言う:

System.NullReferenceException: 'Object reference not set to an instance of an object.' 

Assignment2.Models.Book.Author.get returned null. 

そして、この関数は、私がプログラムを起動したときに動作しますので、これは私には意味がありません。

Bookモデルはここにある:

public interface ILibraryRepository 
{ 
    IQueryable<Book> Books { get; } 
    IQueryable<Author> Authors { get; } 

    Book Save(Book book); 
    Author Save(Author author); 

    void Delete(Book book); 
    void Delete(Author author); 
} 

任意のアイデアは、なぜ私はこのエラーを取得しています:

public class Book 
{ 
    [Key] 
    public int Id { get; set; } 

    [Required] 
    public string Title { get; set; } 

    [Display(Name = "Publication date")] 
    public DateTime? PublicationDate { get; set; } 

    public float? Edition { get; set; } // We might have a 2.5 edition. Rare but happens 

    public int AuthorId { get; set; } 

    public Author Author { get; set; } 
} 

ことができますが、私のILibraryRepositoryがここにある場合、私は見当がつかない?

編集:HomeControllerBooksControllerに変更しました。なぜ私はここで二つを混ぜ合わせたのか分かりません。

+1

されている必要があります私はあなたの嘲笑リポジトリがHomeController' 'になっているか表示されません。 –

+0

これはこれではありませんか? 'Mock = new Mock ();' – alex3wielki

+0

これは 'var controller = new homeController(mock.Object);のようなものが必要だということを意味します。 – juharr

答えて

0

で支援が必要な場合はスタックトレースを含めてください:

Author = { Id = 0...Author = new Author() { Id = 0...

1

でエラーが発生しています。初期化の方法が正確にゼロになっています。基本的には、テストで使用していない初期化メソッド "var controller"の一時的なローカル変数にモックを割り当てる努力をしています。それだけでは不十分だった場合でも、テストメソッドが使用しているコントローラとは違っています。あなたはこのような何かをする必要があるでしょう:

private HomeController controller; 

[TestInitialize] 
public void TestInitialize() 
{ 
    mock = new Mock<ILibraryRepository>(); 

    books = new List<Book>() 
    { 
     new Book { Id = 0, Title = "Title 0", Edition = 0, PublicationDate = DateTime.Now, Author = { Id = 0, Name = "Author 0", DateOfBirth = DateTime.Now, DateOfDeath = DateTime.Now }, AuthorId = 0 }, 
     new Book { Id = 1, Title = "Title 1", Edition = 1, PublicationDate = DateTime.Now, Author = { Id = 1, Name = "Author 1", DateOfBirth = DateTime.Now, DateOfDeath = DateTime.Now }, AuthorId = 1 }, 
     new Book { Id = 2, Title = "Title 2", Edition = 2, PublicationDate = DateTime.Now, Author = { Id = 2, Name = "Author 2", DateOfBirth = DateTime.Now, DateOfDeath = DateTime.Now }, AuthorId = 2 } 
    }; 

    mock.Setup(m => m.Books).Returns(books.AsQueryable()); 

    controller = new HomeController(mock.Object); 
} 

[TestMethod] 
public void IndexLoadsValid() 
{ 
    // Arrange - use arrange from test initialise 

    // Act 
    var result = controller.Index() as ViewResult; 

    // Assert 
    Assert.IsNotNull(result); 
} 

ない、これは必ずしもベストプラクティスですが、あなたが実際にあなたがしたい場合は、ガベージコレクションさせ以外の初期化メソッドの結果で何かをする必要があることそれを使用するためのテスト。

+0

それをキャッチするためにありがとう。私は投稿を編集したが、同じエラーが続く。 '[TestInitialize]'の部分でエラーが発生しています – alex3wielki

+0

テストコードではなく、コードの使用部分になります。私はなぜテストコードで何が起こるのかわからない。コントローラー内のコードに、テストコードによって初期化されていない追加の依存関係がある可能性があります。 Assignment2とは何ですか?コントローラのコンストラクタから静的に直接呼び出されていますか? –

+0

コメントに解決しました。しかし、助けてくれてありがとう! – alex3wielki

0

Author = {Id = 0、etc}を使用しました。これはBooksコンストラクタが作成者もインスタンス化しているものの、まだnullです。 @PaulAbbottが言ったように、あなたが例外

関連する問題