Rhino Mock Entity Framework, использующий шаблон UnitofWork, не работает - PullRequest
5 голосов
/ 17 марта 2011

Это моя первая попытка чего-то подобного, так что, надеюсь, это просто.

Я создал службу WCF, которая использует Entity Framework для доступа к базе данных. Я реализовал интерфейс UnitOfWork , чтобы мой сервис мог использовать EF, пока еще можно тестировать.

Вот мой сервис:

public class ProjectService : IProjectService
{
    private IUnitOfWork db = null;

    public ProjectService(IUnitOfWork unitofwork)
    {
        db = unitofwork;
    }

    public int RegisterSite(int CPUID)
    {
        if (db.Servers.Count(x => x.CPUID == CPUID) > 0)
        {
            // do something
        }

        return 0;
    }
}

Вот мой интерфейс UnitOfWork:

public interface IUnitOfWork
{
    IObjectSet<tblClient> Clients { get; }
    IObjectSet<tblServer> Servers { get; }
    IObjectSet<tblSite> Sites { get; }
    IObjectSet<tblServerLog> ServerLogs { get; }
    void Commit();
}

Когда я использую этот Сервис либо с конкретными реализациями SQLUnitOfWork (используя EF), либо с InMemoryUnitOfWork (только в объектах памяти), тогда он работает нормально.

После тестирования в порядке с моими объектами в памяти я попробовал этот тест.

[Test]
public void RegisterAnExistingServer()
    {
        MockRepository mocks = new MockRepository();

        IUnitOfWork MockUnitOfWork = mocks.DynamicMock<IUnitOfWork>();

        ProjectService service = new ProjectService(MockUnitOfWork);


        Expect.Call(MockUnitOfWork.Servers.Count(x => x.CPUID == 1234)).Return(0);

        mocks.ReplayAll();

        int NewSiteID = service.RegisterSite(1234);

        mocks.VerifyAll();
    }

Но когда я пытаюсь использовать его в Rhino Mock с ожиданием на серверах. Счет, я получаю следующую ошибку:

System.ArgumentNullException : Value cannot be null.
Parameter name: arguments
at System.Linq.Expressions.Expression.RequiresCanRead(Expression expression, String paramName)
at System.Linq.Expressions.Expression.ValidateOneArgument(MethodBase method, ExpressionType nodeKind, Expression arg, ParameterInfo pi)
at System.Linq.Expressions.Expression.ValidateArgumentTypes(MethodBase method, ExpressionType nodeKind, ref ReadOnlyCollection`1 arguments)
at System.Linq.Expressions.Expression.Call(Expression instance, MethodInfo method, IEnumerable`1 arguments)
at System.Linq.Queryable.Count(IQueryable`1 source, Expression`1 predicate)

Что я делаю не так ??

Ответы [ 2 ]

4 голосов
/ 17 марта 2011

MikeEast правильно. Rhino.Mocks не делает рекурсивные насмешки. Вам нужно смоделировать свойство Servers для возврата чего-либо (просто создайте пустой IObjectSet и установите его в качестве возвращаемого значения).

Кроме того, вы не хотите устанавливать ожидания в отношении лямбд. Как только все скомпилировано, лямбда в вашем коде и лямбда в вашем модульном тесте - это два совершенно разных метода (и ваше ожидание всегда будет неудачным). Подробнее см. http://groups.google.com/group/rhinomocks/msg/318a35ae7536d90a.

0 голосов
/ 17 марта 2011

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

Я настоятельно рекомендую перейти на nhibernate.Также кювет WCF.

...