2017-09-19 83 views
0

我正在使用SpecFlow進行集成測試。ObjectDisposedException驗證驗收測試數據時

在下面「然後」 - 工序,我在該行expectedPersons.ShouldAllBeEquivalentTo(actualPersons);得到的ObjectDisposedException:

的ObjectContext的實例已經設置,不能再用於需要連接的操作。

[Then(@"the following persons should be in the database")] 
public void ThenTheFollowingPersonShouldBeInTheDatabase(Table table) 
{ 
    var expectedPersons = table.Rows.Select(expected => new Person 
    { 
     Id = int.Parse(expected["Id"]), 
     Name = expected["Name"], 
     Vorname = expected["Vorname"], 
     Adressen = specflowPersonenAdressen.Where(p => p.PersonId == int.Parse(expected["Id"])).ToList() 
     }).ToList(); 

     var actualPersons = new List<Person>(); 

     foreach (var row in table.Rows) 
     { 
      var queryCriteria = new PersonQueryCriteria 
      { 
       NameFilter = row["Name"], 
       VornameFilter = row["Vorname"] 
      }; 
      actualPersons.AddRange(personWorkUnit.GetPersonen(queryCriteria)); 
     } 

     expectedPersons.ShouldAllBeEquivalentTo(actualPersons); 
    } 
} 

方法personWorkUnit.GetPersonen(...)看起來像這樣:

public ICollection<Person> GetPersonen(PersonQueryCriteria queryCriteria) 
{ 
    using (var context = this.unitOfWorkContextFactory.Create()) 
    { 
     var personRepository = this.repositoryFactory.Create<IPersonRepository>(context); 
     return personRepository.GetPersons(queryCriteria).ToList(); 
    } 
} 

方法personRepository.GetPersons(...)看起來像這樣:

public ICollection<Person> GetPersons(PersonQueryCriteria personQueryCriteria) 
{ 
    var query = this.Context.GetQuery<Person>(); 
    query 
     .Include(q => q.Adressen) 
     .Include("Adressen.Adresse"); 

    if (!string.IsNullOrEmpty(personQueryCriteria.NameFilter)) 
    { 
     query = query.Where(p => p.Name == personQueryCriteria.NameFilter); 
    } 

    if (!string.IsNullOrEmpty(personQueryCriteria.VornameFilter)) 
    { 
     query = query.Where(p => p.Vorname == personQueryCriteria.VornameFilter); 
    } 

    return query.ToList(); 
} 

我已經明確包括的導航屬性如因爲...我理解, EF正在使用延遲加載。

數據庫看起來是這樣的:

人1 ----- * PersonAdresse * ----- 1住址

的模型是這樣的:

public partial class Person 
{ 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] 
    public Person() 
    { 
     this.Adressen = new HashSet<PersonAdresse>(); 
    } 

    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Vorname { get; set; } 

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public virtual ICollection<PersonAdresse> Adressen { get; set; } 
} 

public partial class Adresse 
{ 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] 
    public Adresse() 
    { 
     this.Personen = new HashSet<PersonAdresse>(); 
    } 

    public int Id { get; set; } 
    public string Strasse { get; set; } 
    public string Ort { get; set; } 
    public int Plz { get; set; } 

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public virtual ICollection<PersonAdresse> Personen { get; set; } 
} 

public partial class PersonAdresse 
{ 
    public int Id { get; set; } 
    public int PersonId { get; set; } 
    public int AdresseId { get; set; } 

    public virtual Adresse Adresse { get; set; } 
    public virtual Person Person { get; set; } 
} 
  • 可能是這個問題,這個異常被拋出?

在此先感謝

+1

從何處開始ShouldAllBeEquivalentTo方法?你能告訴我們它的代碼嗎? –

+0

ShouldAllBeEquivalentTo來自FluentAssertions – xeraphim

回答

1

這是因爲延遲加載的啓動。請嘗試在您正在使用的上下文中的下面嘗試禁用LazyLoadingEnabled,如下所示:

this.ContextOptions.LazyLoadingEnabled = false 
+0

這有助於解決異常。但不幸的是,當我嘗試從原始帖子中獲取「GetPersons」方法的人員時,人員被加載時沒有地址......爲什麼是這樣?我將它們包括在查詢中:S – xeraphim

+0

我相信個人和地址是DB中的兩個獨立表,並且要將Addrsses和Person一起加入到EF中。 –