我正在尝试为我的应用程序编写集成测试,该测试利用实体框架和sharprepository。我正在编写一些测试,我注意到在TestCleanup中调用Dispose()时,我在测试中添加到存储库的数据没有被删除。我的代码如下:
[TestInitialize]
public void Initialize()
{
var config = new EntityFrameworkRepositoryConfiguration(null);
_factory = new BasicRepositoryFactory(config);
_channelRepository = _factory.CreateRepository<Channel>();
}
[TestCleanup]
public void Cleanup()
{
_channelRepository.Dispose();
}
[TestMethod]
public void ShouldCreateRepositoryAndExecuteGetAllWithoutExceptions()
{
_channelRepository.GetAll();
}
[TestMethod]
public void ShouldCreateRepositoryAndInsertIntoItWithoutExceptions()
{
var repo = _factory.CreateRepository<Channel>();
// NB: We can't mock this. Has to be real stuff.
var channel = new Channel() { Id = 1 };
_channelRepository.Add(channel);
Assert.AreSame(channel, _channelRepository.Get(1));
}
[TestMethod]
public void ShouldCreateRepositoryAndFindSingleElementBasedOnPredicate()
{
var channels = new[]
{
new Channel(),
new Channel(),
new Channel()
};
_channelRepository.Add(channels);
var firstOfPredicate = _channelRepository.Find(x => x.Id > 3);
Assert.IsTrue(_channelRepository.Count() == channels.Length,
"Seeded array has {0} elements, but the repository has {1}.",
channels.Length,
_channelRepository.Count());
Assert.AreEqual(channels[2].Id, firstOfPredicate.Id);
}
这些测试的主要目的不是测试EntityFramework的SharpRepository实现,而是确保我已经正确配置了Entity Framework。 EntityFrameworkRepositoryConfiguration
只包含一个连接字符串,该字符串传递给BasicRepositoryFactory
- 实际上只调用return RepositoryFactory.GetInstance<T>();
。
我的问题是ShouldCreateRepositoryAndFindSingleElementBasedOnPredicate
失败了,因为ShouldCreateRepositoryAndInsertIntoItWithoutExceptions
中添加的元素仍在存储库中 - 即使存储库应该已放在Cleanup
中。
我该怎么做才能解决这个问题?
答案 0 :(得分:0)
我是愚蠢的 - 我自动认为IRepository会像Entity Framework存储库一样工作,因为所有操作都会排在队列中,直到你调用SaveChanges;不。实际发生的是,当您在IRepository上使用任何CRUD操作时,所有更改都会立即提交。
我昨晚发现了Batches,基本上是延迟队列动作。我应该将它们用于测试,而不是IRepository。