2015-12-01 1 views
1

У меня есть класс, как показано ниже, где с помощью Fluent NHibernate Я получаю данные из базы данныхКак проверить метод расширения Nhibernate, который не возвращает значение даже после указания возврата в fakeiteasy?

public class MyActualClass 
{ 
    public MyActualClass(ISessionFactory sessionFactory) 
    { 
     this.sessionFactory = sessionFactory; 
    } 

    public List<AnnualInformation> GetData() 
    { 
     using (session = sessionFactory.OpenSession()) 
     { 
      var result = session.QueryOver<AnnualInformation>() 
         .SelectList(list => list 
            .Select(x => x.Id) 
            .Select(x => x.CreationDate) 
            .Select(x => x.AnnualAmount) 
            .Select(x => x.AnnualCurrency) 
            .Select(() => monthlyAlias.MonthlyAmount) 
            .Select(() => monthlyAlias.MonthlyCurrency) 
            .Select(() => shareAlias.CurrentSharevalue) 
            .Select(() => miscAlias.MarketValueAmount) 
            ).Where(a => a.Id == 123456).List<AnnualInformation>(); 
     } 
    } 
} 

Я Выписали блок тестовый пример для описанным выше способом, как ниже

public class MyTestClass 
{ 
    private static ISessionFactory sessionFactory; 
    private static ISession session; 

    public MyTestClass() 
    { 
     sessionFactory = A.Fake<ISessionFactory>(); 
     session = A.Fake<ISession>(); 

     A.CallTo(() => sessionFactory.OpenSession()).Returns(session); 
    } 

    [Fact] 
    public void MyTest() 
    { 
     var annualDetails = 
       new AnnualInformation 
       { 
        Id= 1, 
        AnnualCurrency= "string", 
        AnnualAmount= "Example" 
       } 
     var listOfAnnualInformation= 
      new List<AnnualInformation> 
      { 
       annualDetails 
      }; 

     A.CallTo(session.QueryOver<AnnualInformation>()).WithReturnType<IList<AnnualInformation>>().Returns(listOfAnnualInformation); 
     var myInstance = new MyActualClass(sessionFactory); 
     myInstance.GetData(); 
    } 
} 

На самом деле, если вы видите ниже код

session.QueryOver() .SelectList (...

будет возвращать результат» "в методе GetData(). После этого я манипулирую с «результатом», чтобы получить Id, CreationDate, AnnualAmount, AnnualCurrency
Поэтому очень важно, чтобы какое-то значение возвращалось из «результата». Моя проблема заключается в подсчет resulty всегда 0.

Я хочу ниже строки кода

A.CallTo (session.QueryOver()) WithReturnType>() Возвращает (listOfAnnualInformation)..;

, чтобы вернуть список с по крайней мере одним элементом. Теперь я считаю, что я уточнил свои требования.

Пожалуйста, предложите, что нужно делать здесь?

+0

AFAIK, вы не можете издеваться статические методы с FakeItEasy и методы расширения статические методы –

+0

Якуб, мой главный фокус здесь в том, что почему ниже линии не приносит мне желаемого результата A.CallTo (session.QueryOver .()) Возвращает (listOfAnnualInformation); –

+0

Является ли 'QueryOver' методом расширения? Если это так, то FakeItEasy не может контролировать свой выход, AFAIK. –

ответ

2

на основе нового кода (который до сих пор не совсем компиляции - отсутствует ;, result не вернулся из GetData, и если бы это было, возвращаемый тип GetData должен быть IList<AnnualInformation>, но с этими изменениями я был в состоянии чтобы получить тест для запуска) я могу предложить некоторые комментарии:

A.CallTo(session.QueryOver<AnnualInformation>()).WithReturnType<IList<AnnualInformation>>() 
    .Returns(listOfAnnualInformation); 

Настраивает объект, который возвращается из вызова session.QueryOver<AnnualInformation>(). (Обратите внимание, что здесь нет лямбда, так что эта линия фактически называет QueryOver.)
session - это подделка, и поэтому, когда вы вызываете QueryOver<AnnualInformation>() на этой линии, она вернет новый Fake IQueryOver. «WithReturnType ... Returns ...» настраивает новый Fake IQueryOver для возврата listOfAnnualInformation, когда вызывается любой метод, возвращающий IList<AnnualInformation>.

Однако, когда вызывается методы Fakes, если они не были настроены на выполнение чего-то другого, они возвращают новый объект. Итак, внутри GetData, когда вы звоните QueryOver, вы получаете другую фальшивку IQueryOver, которая не была настроена вообще. Это одна проблема.

Вторая проблема: звонок в SelectList вернет еще один поддельный IQueryOver.

Мы можем обойти все эти вещи:

var aFakeQueryOver = A.Fake<IQueryOver<AnnualInformation, AnnualInformation>>(); 
A.CallTo(aFakeQueryOver).WithReturnType<IQueryOver<AnnualInformation, AnnualInformation>>() 
    .Returns(aFakeQueryOver); 
A.CallTo(aFakeQueryOver).WithReturnType<IList<AnnualInformation>>() 
    .Returns(listOfAnnualInformation); 

A.CallTo((() => session.QueryOver<AnnualInformation>())).Returns(aFakeQueryOver); 

А теперь фальсифицирующий ведет себя, как мы хотим. Однако все, что мы сделали, это короткое замыкание всей логики в GetData, за исключением того, что для открытия сеанса используется sessionFactory, а затем QueryOver на этом сеансе. SelectList и Where и List все были обойдены.

Мой обычный совет в этой ситуации - сделать ваш уровень доступа к данным как можно более тонким и интегрировать его. В качестве альтернативы, я видел, как люди предполагают, что NHibernate использует базу данных MySql в памяти. Тем не менее тест интеграции рода, но, по крайней мере, он более изолирован.

+0

Да, вы правы, должен быть A.CallTo (() => session.QueryOver ()). Возвращает (listOfAnnualInformation); Но даже если я сохраню это, я не получаю никакого возвращаемого значения, о котором я упомянул. listOfAnnualInformation в GetData всегда появляется с 0 записями после Queryover Call. Не уверен, что происходит –

+0

Я добавил ваш код в тестовый проект и начал использовать FluentNHibernate, чтобы узнать, могу ли я выяснить вашу проблему, но тестовый код, который вы предоставили, даже не компилируется (для начала, отсутствует ';' после того, как вы объявите 'annualDetails'). Я также не могу сказать, какой тип 'listOfAnnualInformation' - это не может быть' List', так как возвращаемый тип 'QueryOver' является' QueryOver'. Не могли бы вы заполнить эти недостающие данные и предоставить компиляционный провал, с которым мы могли бы работать? (Даже после этого есть много других запросов QueryOver, поэтому в итоге мы можем просто реализовать факсимильный запрос QueryOver ...) –

+0

Я обновил код с помощью ваших предложений. См. Выше –

Смежные вопросы