Unit testing 基于嵌套实体框架成员的FakeiTesy单元测试

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

我们正在尝试对依赖实体框架4.1的代码进行单元测试。我已经看到了一些针对POCO实现单元测试的帖子,但是我们希望保留默认的EF管道,以便我们可以轻松地使用

Fakeitesy似乎可以处理抽象EF,但我很难断言发生了什么。例如,我的模型中有此代码(其中有另一个
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();
现在我想它应该能用了