FakeItEasy Создать подделку класса - PullRequest
5 голосов
/ 18 октября 2011

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

Я попробовал следующее:

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

В результате конструктор не найден с исключением из подходящих аргументов

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

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 выше, не сработало?

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

Ответы [ 2 ]

3 голосов
/ 27 мая 2016

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

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

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.Fakedid call) не удалось инициализировать блок глобальной памяти из-за того, что Visual Studio не работает в режиме администратора.(CreateFileMapping, код ошибки 5, Системная ошибка 0x5: CreateFileMapping () )

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

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

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

0 голосов
/ 18 октября 2011

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

...