2016-08-01 3 views
0

ユニットテスト(NUnitを使用)があり、Entity Framework 6で追加操作を模擬しようとしています。追加操作では、エンティティを再ロードして、新しく作成されたIDが返されるようにします。私が実行している問題は、エンティティをリロードするときに、「データベースが作成された後にコンテキストをサポートするモデルが変更されました」というエラーが表示されることです。私が確認したすべてのGoogleの回答には、模擬シナリオに適用した場合の解決策はありません。Moq、NUnit、およびEntity Frameworkを使用して保存されたエンティティをリロードする

[Test] 
[Description("Add")] 
public void Add() 
{ 
    var person = new Person 
    { 
     FirstName = "John", 
     LastName = "Doe", 
     Dob = new DateTime(1984, 8, 23), 
     Ssn = "555-55-5555" 
    }; 

    var mockDbSet = new Mock<DbSet<Person>>(); 
    mockDbSet.Setup(s => s.Create()).Returns(new Person()); 

    var mockContext = new Mock<PersonContext>(); 
    mockContext.Setup(c => c.People).Returns(mockDbSet.Object); 

    context.Object.People.Add(person); 
    context.Object.SaveChanges(); 

    // This code will throw an error. 
    //context.Object.Entry(person).Reload(); 

    mockDbSet.Verify(m => m.Add(It.IsAny<Person>()), Times.Once()); 
    mockContext.Verify(m => m.SaveChanges(), Times.Once()); 

    // To do: Test that the id was populated from the reload operation. 
} 

エンティティをリロードして新しいIDを取得するにはどうすればよいですか?

+3

エンティティをリロードする必要はありません。そのId値は 'SaveChanges'の間に設定されるべきです。あなたはそれを嘲笑したいかもしれませんが、私はそれが役に立たないと思います。あなたがテストしているのは、モックフレームワークが動作するかどうかだけです。 (私はDBの相互作用を嘲笑には信じていない)。 –

答えて

0

私はEF 5の古いコードを使用していることが分かりました。この回答には、両方の方法を含めるように更新されました。

// This is how to return a newly inserted id from EF 6. 
public int AddMyEntity(MyEntity myEntity) 
{ 
    dbContext.MyEntities.Add(myEntity); 
    context.SaveChanges(); 
    return myEntity.Id; 
} 

// This is how to return a newly inserted id from EF 5. 
public int AddMyEntity(MyEntity myEntity) 
{ 
    dbContext.MyEntities.Add(myEntity); 
    dbContext.SaveChanges(); 
    dbContext.Entry(myEntity).Reload(); 
    return myEntity.Id; 
} 
関連する問題