2011-10-18 2 views
5

Недавно я пытался использовать FakeItEasy, но я не смог создать Fake из конкретного класса, не обойдя многие причуды.FakeItEasy Создайте подделку класса

Я попытался следующие:

public class MyObject { 
public MyObject(){} 
} 
... 
MyObject fakeObject = A.Fake<MyObject>(); 

Что привело в конструкторе не найден с соответствующими заданы параметры Exception

Далее я попробовал:

public class MyObject { 
public MyObject(string temp){} 
} 
... 
MyObject fakeObject = A.Fake<MyObject>(x => x.WithArgumentsForConstructor(() => new MyObject("temp"))); 

что привело к подобной ошибки.

Наконец я попытался:

public class MyObject { 
//public MyObject(){} 
} 
... 
MyObject fakeObject = A.Fake<MyObject>(); 

что позволило мне, наконец, создать подделку. Я смущен, почему большинство примеров фальсификации конкретного класса ссылаются на это легче, чем я нашел? И почему использование документированного метода, испытание № 2 выше, не сработало?

Существуют ли какие-то ограничения для подделки конкретного класса, которые не документированы?

ответ

0

Я не могу воспроизвести проблему, когда работает эквивалентный код, он работает для меня. Не могли бы вы создать vs-решение, которое воспроизводит проблему, и submit an issue on GitHub?

1

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

У меня есть класс:

public class Service : IService 
{ 
    public Service (int prNum) 
    { 
    //call to a c++ wrapper class (this is where the problem occurs) 
    //some other calls 
    } 
} 

Я пытался создать класс обслуживания как подделка для модульного тестирования:

private Service fakeServ = A.Fake<Service>((x => x.WithArgumentsForConstructor(() => new Service(3)))); 

я получал ту же ошибку: Конструктор не найден с Соответствие аргументов Исключение

В конце концов я вошел в вызов A.Fake с отладчиком и нашел код внутри конструктора (который A.Fake действительно вызывал) не смог инициализировать блок глобальной памяти из-за того, что Visual Studio не работает в режиме администратора. (CreateFileMapping, код ошибки 5, System Error 0x5: CreateFileMapping())

Я установил визуальную студию как администратор, и проблема была решена, созданная подделка.

Похоже, что Fake, созданный с помощью конструктора с параметрами, запускается через конструктор (именно этого я и надеялся избежать, создав подделку, поскольку глобальная память не является частью фокуса моего модульного теста, I мне придется заглянуть, если есть другой способ, которым я должен это создавать).

Код, который вы отправили, не означает, что вы вызываете классы-оболочки или создаете глобальную память, но вы можете попробовать войти в вызов Fake create с помощью отладчика, чтобы увидеть, будет ли конструктор запущен, и если произошел сбой в конструктор и какие ошибки возвращаются.

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