2016-08-09 2 views
1

Я пишу некоторые тесты на устойчивость, но я получаю сообщение об ошибке, что NHibernate не может работать с подделками FakeItEasy. В частности, ошибка:«Отсутствие ошибки« класса »при тестировании Fluent NHibernate с FakeItEasy

Нет стойкая бактерия для: Castle.Proxies.FacilityProxy

Если я пишу тест, как показано ниже, он будет работать нормально и пройти

[Test] 
    public void CanCorrectlyCreateFacilityTable() 
    { 
     new PersistenceSpecification<Facility>(session, new DataEqualityComparer()) 
      .CheckProperty(f => f.Id, 1) 
      .CheckProperty(f => f.Name, _facility.Name) 
      .CheckReference(f => f.Owner, new Client()) 
      .VerifyTheMappings(); 
    } 

Однако, если Я создаю фальшивку:

 IClient _client; 
     _client = A.Fake<Client>(); 
     A.CallTo(() => _client.Name).Returns("Preston"); 

И передать это вместо теста - кажется, f ail с ошибкой выше:

[Test] 
    public void CanCorrectlyCreateFacilityTable() 
    { 
     new PersistenceSpecification<Facility>(session, new DataEqualityComparer()) 
      .CheckProperty(f => f.Id, 1) 
      .CheckProperty(f => f.Name, _facility.Name) 
      .CheckReference(f => f.Owner, _client) 
      .VerifyTheMappings(); 
    } 

Кто-нибудь знает, есть ли обходной путь или возможная ошибка на моем конце?

Я провел здесь немного исследований, но, похоже, не мог найти этот вопрос, который уже задан. Большинство озаботились с конфигурацией FakeItEasy или конфигурации NHibernate - который, кажется, не быть проблемой: How do I test extension method of Nhibernate which does not return the value even after specifying return in fakeiteasy? Can I sensibly mock this NHibernate query?

+1

Я не использовал тесты 'PersistenceSpecification' некоторое время, но если я правильно помню, isn В целом, чтобы убедиться, что интеграция с базой данных настроена правильно? Если да, зачем вам подделывать/издеваться над тестируемым объектом? –

+0

@AndrewWhitaker есть несколько свойств в классе Client, которые я предпочитаю оставаться защищенными, а не публичными. Издевательство над классом казалось более элегантным решением, но, согласно приведенному ниже ответу Блэра, я думаю, что мне нужно просто использовать сам класс. Спасибо, что потянулся! – prestonsmith

ответ

1

Я не NHibernate пользователь, поэтому не может быть много помощи. Возможно, вы уже знаете, что причина, по которой вы видите это поведение, заключается в том, что FakeItEasy создает Fakes посредством (используя класс DynamicProxy от Castle.Core в процессе), создавая совершенно новый класс, который расширяет поддельный класс (или реализует поддельный интерфейс).

Вы не указали определение класса Client, но я предполагаю, что некоторый член на нем имеет тип Facility, поэтому, когда свойство ... (я предполагаю) обращается к нему, чтобы сохранить объект, возвращаемое значение имеет тип FacilityProxy, а NHibernate не знает, что с ним делать.

Мне кажется, что принятый ответ в Can I sensibly mock this NHibernate query? имеет правильную идею: тест с объектом фактического типа, который вы хотите сохранить.

Если это неприятно, я думаю, только то, что я могу предложить являются:

  1. настройки Facility -typed свойства (опять же, я полагаю, свойство), чтобы вернуть фактические Facility (и, возможно, делает это для ассортимент других участников), или
  2. преподавание NHibernate около FacilityProxy, хотя это может быть сложно. Я не знаю NHibernate, но поскольку у вас нет доступа к классу во время компиляции, это может быть сложно.
+0

Спасибо @blairconrad - использование обычного класса не обязательно неприятно, я просто подумал, что было бы более элегантно использовать макет в этом случае.Я думал, что, возможно, Fake It Easy содержит какое-то другое поведение, о котором я не знал, но я могу изменить тесты, чтобы вместо этого использовать «реальные» объекты. Цените помощь, хотя! – prestonsmith

+1

Нет проблем. Надеюсь, это сработает. Хотя насмешливые объекты могут быть полезны, когда «реальные» объекты сложны в использовании, в общем я рекомендую использовать «реальные» объекты, когда это возможно. Вы получите лучшее представление о том, как будет действовать ваша производственная система. –

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