2013-01-17 2 views
5

У меня есть сложный объект, который я пытаюсь подделать.FakeItEasy глубоко вложенные типы faking

interface IContext 
{ 
    User User { get; } 
} 

A.CallTo(
    () => _fakeContext.User.Subscription.Attributes) 
    .Returns(new List<Attribute>()); 

Но я получаю следующее исключение:

The current proxy generator can not intercept the specified method for the following reasons: - Non virtual methods can not be intercepted

Все вложенные типы являются свойствами, и они представляют собой простые анемией типы с get; set; модификаторов свойств. И когда я смотрю в отладчик, все они подделки.

Есть ли способ установить последнее свойство цепи и избежать установки всех предыдущих?

+0

Является собственность на 'User' виртуальной? Если бы вы могли опубликовать исходный код для 'User'? – Xharze

+0

Нет. Ни пользователь, ни подписка не являются виртуальными. Это код из скомпилированной сборки. –

+2

FakeItEasy не может высмеивать не виртуальные методы, поэтому вам нужно решить построить сам объект. Что-то вроде ответа ниже сделало бы трюк. – Xharze

ответ

3

Если ваши объекты достаточно анемия, вы можете дать AutoFixture идти:

var fake = A.Fake<>(); 
var fixture = new Fixture(); 
// If it's possible [1], AutoFixture will generate entire object graph 
var user = fixture.CreateAnonymous<User>(); 
// Since data will be random [2], you can overwrite properties as you like 
user.User.Subscription.Attributes = new List<Attributes>(); 
A.CallTo(() => fake.User).Returns(user); 
  1. для того, чтобы работать, пользовательские объекты должны иметь открытый конструктор и предпочтительно избегать использования интерфейсов (но это можно смягчить с помощью авто-насмешек расширений, таких как AutoFakeItEasy).
  2. Метод .Build обеспечивает свободно API для настройки объектов автогенерации, поэтому хаотичности можно управлять
Смежные вопросы