2016-01-29 2 views
0

Я использую Rhino Mocks для ограничения функциональности конечной точки SOAP и по большей части работает. Но, интерфейс довольно своеобразно и я изо всех сил, чтобы получить следующие работы (я переименовал классы для простоты)Rhino Mocks - Arg <T>, чтобы опустить некоторые параметры

public interface IWebService 
    { 
     void CopyFile(Request request); 
    } 

public interface IService 
{ 
    void CopyFile(string filename, byte[] data); 
} 

public class Request 
{ 
    public string Filename { get; set; } 
    public byte[] Data { get; set; } 
} 
public class Service : IService 
{ 
    IWebService _service; 
    public Service(IWebService service) 
    { 
     _service = service; 
    } 
    public void CopyFile(string filename, byte[] data) 
    { 
     _service.CopyFile(new Request() {Filename = filename,Data = data }); 
    } 
} 

Теперь в моем тесте у меня есть что-то вроде этого

[TestCase] 
     public void TestFileCopyFailsIfFilenameIsMissing() 
     { 
      IWebService serviceMock = MockRepository.GenerateMock<IWebService>(); 
      serviceMock.Expect(x => x.CopyFile(Arg<Request>.Is.Equal(new Request() { Filename = Arg<string>.Is.Null, Data = Arg<byte[]>.Is.Anything }))).Throw(new Exception()); 

      Service service = new Service(serviceMock); 
      service.CopyFile(null, new byte[] { }); 

     } 

Который выдает исключение: Исключение типа «System.InvalidOperationException» произошло в Rhino.Mocks.dll, но не было обработано в коде пользователя

Дополнительная информация: Используйте AR ONLY только во время вызова метода mock во время записи. Ожидается 1 аргумент, 3 определены.

Я пробовал все возможности в мире на этом, но не могу понять это правильно. Если я не использую Arg и использовать

Expect(null, new byte[]{}); 

всегда будет проходить независимо от того, что

+0

Я думаю, вы должны overide Равно метод в Reqeust, чтобы заставить его работать .... или вы должны отдельно сравнить файл и данные вместо весь запрос – Viru

+0

Привет Виру, я не могу переопределить запрос, поскольку он создается автоматически с помощью инструмента каждый раз, когда создается веб-сервис, и я не являюсь поставщиком веб-интерфейса. Есть ли что-то еще, что можно сделать? –

+0

Вы можете получить доступ к свойству FileName и Data, выполнив что-то liek this Arg .FileName ?? Идея заключается в том, что вы можете получить доступ к определенному свойству, а затем сравнить их вместо всего запроса. – Viru

ответ

0

я предлагаю использовать WhenCalled и в этом методе проверки Request объекта.

 bool isCorrectParam = false; 

     IWebService serviceMock = MockRepository.GenerateMock<IWebService>(); 
      serviceMock.Expect(x => x.CopyFile(null)) 
       .IgnoreArguments() 
       .WhenCalled(x => 
       { 
        Request req = x.Arguments[0] as Request; 
        if (req.Data.Count() == 0 && req.Filename == null) 
        { 
         isCorrectParam = true; 
        } 
       }); 

     Service service = new Service(serviceMock); 
     service.CopyFile(null, new byte[] { }); 

     Assert.IsTrue(isCorrectParam); 
0

вы также можете использовать спички ...

serviceMock.Expect(x => x.CopyFile(Arg<Request>.Matches(r => r.FileName==null))).Throw(new Exception()); 
+0

работал как шарм, спасибо большое! :) –

+0

Рад, что я мог бы помочь ... Будет добрым, если вы согласитесь ответить :) – Viru

+0

Прошу прощения за недостаток компетентности, но я действительно искал, как принять его, но, похоже, не нашел его. Не то, что у вас возникли вопросы, заданные здесь –