Модульное тестирование с FakeItEasy против вложенного члена Entity Framework - PullRequest
0 голосов
/ 12 августа 2011

Мы пытаемся выполнить модульное тестирование кода, основанного на Entity Framework 4.1. Я видел несколько постов, в которых реализовано модульное тестирование с использованием POCO, но мы хотели бы сохранить стандартную систему EF, чтобы мы могли легко использовать EF Caching Wrapper .

FakeItEasy, кажется, обрабатывает абстрагирование EF, но у меня проблемы с утверждением того, что произошло. Например, у меня есть код в моей модели (где есть другой частичный класс Email, который является автоматически сгенерированным кодом из мастера EF для базы данных в первую очередь):

public partial class Email 
{
    IMyEntities _dataContext;

    public Email(IMyEntities myEntities)
    {
        _dataContext = myEntities;
    }
    public void SendEmails()
    {
        // ... code to send emails goes here...
        _dataContext.Emails.AddObject(this);
        _dataContext.SaveChanges();
    }
}

Тогда в моем модульном тесте с FakeItEasy:

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();

Как я могу узнать из моего модульного теста, что context.Emails.AddObject действительно вызвали?

Спасибо!

Ответы [ 2 ]

1 голос
/ 20 августа 2011

Вам нужно установить свойство Email вашего контекста на подделку:

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();

Теперь, я думаю, это должно сработать.

0 голосов
/ 14 августа 2011

Я нашел обходной путь, от которого я не в восторге, но он работает.Вместо вызова AddObject() для дочернего объекта вы можете вызвать устаревший метод AddTo[Collection Name]() для самого контекста данных.Поскольку это всего лишь поверхностный вызов метода, его можно легко оценить с помощью FakeItEasy.

Мой код изменился следующим образом:

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();

Конечно, делая это, вы всегда игнорируете предпочтительные, не осуждаемые методы всякий раз, когда хотите добавить в коллекцию контекст данных.Не говоря уже о том, что есть большая вероятность, что позже меня застанет необходимость определить выполнение метода дочернего объекта ...

Если кто-нибудь знает лучший способ, пожалуйста, поделитесь!

Спасибо,

Эрик

...