Unit testing 基于嵌套实体框架成员的FakeiTesy单元测试
我们正在尝试对依赖实体框架4.1的代码进行单元测试。我已经看到了一些针对POCO实现单元测试的帖子,但是我们希望保留默认的EF管道,以便我们可以轻松地使用 Fakeitesy似乎可以处理抽象EF,但我很难断言发生了什么。例如,我的模型中有此代码(其中有另一个Unit testing 基于嵌套实体框架成员的FakeiTesy单元测试,unit-testing,entity-framework-4,entity-framework-4.1,fakeiteasy,Unit Testing,Entity Framework 4,Entity Framework 4.1,Fakeiteasy,我们正在尝试对依赖实体框架4.1的代码进行单元测试。我已经看到了一些针对POCO实现单元测试的帖子,但是我们希望保留默认的EF管道,以便我们可以轻松地使用 Fakeitesy似乎可以处理抽象EF,但我很难断言发生了什么。例如,我的模型中有此代码(其中有另一个Emailpartial类,它是EF database first向导自动生成的代码): 然后在FakeiTasy的单元测试中: var context = A.Fake<IMyEntities>(); var email = A
Email
partial类,它是EF database first向导自动生成的代码):
然后在FakeiTasy的单元测试中:
var context = A.Fake<IMyEntities>();
var email = A.Fake<Email>(context);
// ... code to configure email goes here ...
email.SendEmails();
// this fails with a FakeItEasy.ExpectationException...
A.CallTo(() => context.Email.AddObject(email)).MustHaveHappened();
var context=A.Fake();
var email=A.Fake(上下文);
// ... 配置电子邮件的代码位于此处。。。
email.sendmails();
//此操作失败,出现虚假的。ExpectationException。。。
A.CallTo(()=>context.Email.AddObject(Email)).musthaveOccurd();
我怎么能从单元测试中知道context.Emails.AddObject
确实被调用了
谢谢大家! 我找到了一个我并不热衷的解决方法,但确实有效。不必对子对象调用
AddObject()
,您可以对数据上下文本身调用不推荐使用的方法AddTo[Collection Name]()
。因为这只是一个浅层的方法调用,所以FakeiTasy可以很容易地对其进行评估
我的代码更改为:
public void SendEmails()
{
// ... code to send emails goes here...
_dataContext.AddToEmails(this);
_dataContext.SaveChanges();
}
然后,在我的单元测试中:
A.CallTo(_dataContext).Where(m => m.Method.Name == "AddToEmails").MustHaveHappened();
A.CallTo(() => _dataContext.SaveChanges()).MustHaveHappened();
当然,这样做的缺点是,每当您想要添加到数据上下文集合时,总是忽略首选的、未弃用的方法。更不用说,我以后很有可能会因为需要确定子对象方法的执行而被绊倒
如果有人知道更好的方法,请分享
谢谢,
Eric我找到了一个我并不热衷的解决方法,但它确实有效。不必对子对象调用
AddObject()
,您可以对数据上下文本身调用不推荐使用的方法AddTo[Collection Name]()
。因为这只是一个浅层的方法调用,所以FakeiTasy可以很容易地对其进行评估
我的代码更改为:
public void SendEmails()
{
// ... code to send emails goes here...
_dataContext.AddToEmails(this);
_dataContext.SaveChanges();
}
然后,在我的单元测试中:
A.CallTo(_dataContext).Where(m => m.Method.Name == "AddToEmails").MustHaveHappened();
A.CallTo(() => _dataContext.SaveChanges()).MustHaveHappened();
当然,这样做的缺点是,每当您想要添加到数据上下文集合时,总是忽略首选的、未弃用的方法。更不用说,我以后很有可能会因为需要确定子对象方法的执行而被绊倒
如果有人知道更好的方法,请分享
谢谢,
Eric您需要将上下文的电子邮件属性设置为假:
var context = A.Fake<IMyEntities>();
var mail = A.Fake<WhateverTypeTheEmailPropertyHas>();
A.CallTo(() => context.Email).Returns(mail);
var email = A.Fake<Email>(context);
// ... code to configure email goes here ...
email.SendEmails();
// this fails with a FakeItEasy.ExpectationException...
A.CallTo(() => mail.AddObject(email)).MustHaveHappened();
var context=A.Fake();
var mail=A.Fake();
A.CallTo(()=>context.Email).Returns(mail);
var email=A.Fake(上下文);
// ... 配置电子邮件的代码位于此处。。。
email.sendmails();
//此操作失败,出现虚假的。ExpectationException。。。
A.CallTo(()=>mail.AddObject(email)).musthaveOccurd();
现在我想应该可以了。您需要将上下文的电子邮件属性设置为false:
var context = A.Fake<IMyEntities>();
var mail = A.Fake<WhateverTypeTheEmailPropertyHas>();
A.CallTo(() => context.Email).Returns(mail);
var email = A.Fake<Email>(context);
// ... code to configure email goes here ...
email.SendEmails();
// this fails with a FakeItEasy.ExpectationException...
A.CallTo(() => mail.AddObject(email)).MustHaveHappened();
var context=A.Fake();
var mail=A.Fake();
A.CallTo(()=>context.Email).Returns(mail);
var email=A.Fake(上下文);
// ... 配置电子邮件的代码位于此处。。。
email.sendmails();
//此操作失败,出现虚假的。ExpectationException。。。
A.CallTo(()=>mail.AddObject(email)).musthaveOccurd();
现在我想它应该能用了