我正在使用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