Синтаксис для насмешки метода с аргументом ref - PullRequest
2 голосов
/ 04 мая 2011

У меня проблема в том, что я не могу смутить метод, имеющий аргумент ref.Подпись метода, который я хочу смоделировать, выглядит следующим образом:

class ContractRepository
...
public long GetValueAndIncrement(ref Counter counter)
{
 ...
}

Я пытался смоделировать это так:

Random myRandomizer = new Random();
var contractRepo = new SIContractRepository();
contractRepo.GetValueAndIncrementCounterRef = ((internalCounter) => Int64.Parse(myRandomizer.Next().ToString()));

Но компилятор говорит мне, что мне не хватаетключевое слово "ref", но когда я пытаюсь сделать это следующим образом

Random myRandomizer = new Random();
var contractRepo = new SIContractRepository();
contractRepo.GetValueAndIncrementCounterRef = ((ref internalCounter) => Int64.Parse(myRandomizer.Next().ToString()));

, я получаю ошибку, что ref является недопустимым выражением

К сожалению, Google здесь не помогает.:( Есть идеи?

Ответы [ 4 ]

1 голос
/ 15 мая 2012

Помните, что текущая версия Moles поддерживает только аргументы ref и out в качестве аргумента LAST метода.

http://research.microsoft.com/en-us/projects/pex/molesmanual.pdf

Ограничения Текущая реализация Moles имеет несколько ограничений.Эти ограничения не присущи подходу и могут быть устранены в будущих выпусках Moles:  Инфраструктура Moles поддерживает только ограниченное количество сигнатур метода - до 10 аргументов, , где последний аргумент может быть аргументом out или ref.. Сигнатуры методов с указателями не поддерживаются. Запечатанные классы или статические методы не могут быть заглушены, потому что типы заглушек зависят от диспетчеризации виртуальных методов.Для таких случаев используйте типы родинок, как описано в разделе «Типы родинок» далее в этом документе

1 голос
/ 04 мая 2011

Вы можете использовать анонимные методы с ключевым словом ref , просто явно укажите тип в анонимном методе:

(ref Counter internalCounter) => Int64.Parse(myRandomizer.Next().ToString())
1 голос
/ 04 мая 2011

Вы просто не можете использовать анонимные методы в этом случае, потому что они не поддерживают ни ref, ни out параметры.Вам нужно создать «настоящий» метод.

public void SetupMock()
{
    Random myRandomizer = new Random();
    var contractRepo = new SIContractRepository();
    contractRepo.GetValueAndIncrementCounterRef = GetValueAndIncrementMock;
}

public long GetValueAndIncrementMock(ref Counter counter)
{
    return Int64.Parse(myRandomizer.Next().ToString())
}
0 голосов
/ 22 марта 2012

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

///method get call in unit test
public static void DetermineSprintCorporateLiableCustomer()
{
  COptions p2 = new COptions();  
  MGetCOptions.CustomerInfoCallerOptionsRef = (ref COptions p1) =>
  {
    if (p1 != null && p1 != null && p1.Type.Equals(
      "Data", StringComparison.OrdinalIgnoreCase))
      {
        p1.Type = "P";
        p1.Indicator = true; 
      }
    p2 = p1;
  };
}

Когда эта часть выполняется во время пробного запуска, доступен новый p2. Ниже был мой сценарий.

// need to unit test Coptions.Type="Data"
public static MainMethod(Coptions)
{
  Mclass.Method(ref Coptions);
  If(COptions.Type="B")
    Do something();
} 

Работает с новым значением, но может быть и лучший способ.

...