我正在使用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; }
}
- 可能是這個問題,這個異常被拋出?
在此先感謝
從何處開始ShouldAllBeEquivalentTo方法?你能告訴我們它的代碼嗎? –
ShouldAllBeEquivalentTo來自FluentAssertions – xeraphim