유효하지 않은 전화, 마지막 통화가 사용되었거나 전화가 없습니다.
-
18-09-2019 - |
문제
모의를 설정하려고 할 때이 오류가 발생합니다. PropertyBehavior()
:
System.InvalidOperationException : System.InvalidOperationException : 잘못된 호출, 마지막 호출이 사용되었거나 호출이 없어졌습니다 (가상 (C#) / 재정의 가능 (VB) 메소드를 호출하는지 확인하십시오.
나는 만 사용하려고합니다 코뿔소 조롱 3.5 (주선, 행동, 주장)
내 코드는 다음과 같습니다.
private IAddAddressForm form;
private AddAddressMediator mediator;
[TestInitialize()]
public void MyTestInitialize()
{
form = MockRepository.GenerateMock<IAddAddressForm>();
mediator = new AddAddressMediator(form);
// Make the properties work like a normal property
Expect.Call(form.OKButtonEnabled).PropertyBehavior();
//I tried this too. I still get the exception
//SetupResult.For(form.OKButtonEnabled).PropertyBehavior();
}
[TestMethod]
public void TestOKButtonEnabled()
{
form.OKButtonEnabled = true;
Assert.IsTrue(form.OKButtonEnabled);
}
나는 스터브를 사용할 수 있다는 것을 알고 있습니다 (그리고 위의 코드는 내가해야합니다). 그러나 나는 코뿔소 모의를 배우려고 노력하고 있습니다.
결국 나는 여러 속성에 해당 값이 액세스되도록 할 수 있기를 원합니다. (확인 방법에 대한 힌트 form.FirstName
접근 (즉, 게터가 부름)도 감사 할 것입니다.)
필요한 경우 여기에 코드가 있습니다. IAddressForm
:
namespace AddressBook
{
public interface IAddAddressForm
{
string FirstName { get; set; }
string LastName { get; set; }
string Address1 { get; set; }
string State { get; set; }
string Address2 { get; set; }
string ZipCode { get; set; }
string City { get; set; }
bool OKButtonEnabled { get; set; }
}
}
어쨌든, 나는 인터페이스를 통과 할 때 가상이 문제가되지 않을 것이라고 생각했지만 분명히 무언가를 놓치고 있습니다.
해결책
사용하지 않았습니다 PropertyBehavior
전에는하지만 이것이 당신이 찾고있는 구문입니까?
form.Stub(x=>x.OKButtonEnabled).PropertyBehavior()
Rhino Mocks는 이제 확장 방법을 통해 완전히 작동합니다. 내가 더 이상 만드는 유일한 정적 호출은 MockRepository.GenerateStub
.
다른 팁
당신은 모의 대신 스터브를 사용하는 것을 언급했지만 변경하기 전에 이상하게도 GenerateStub을 사용할 때 유효하지 않은 호출 예외를 얻을 수 있습니다.
View = MockRepository.GenerateStub<IAddressView>();
View.Stub(v => v.Message).PropertyBehavior();
이것은 잘못된 호출 예외를 던지고 예, iaddressview.message에는 getter and setter가 있습니다.
비가적인 방법에 대한 기대를 설정하려고 할 때이 오류를 받았습니다.
mockedObject.Expect(a => a.NonVirtualMethod()).Returns(null);
비 제한 메드 가상을 만들었을 때 오류가 사라졌습니다.
나는 당신이 모든 기대치를 설정 하고이 모의 사용을 시작하기 전에 mockrepository.replyall ()을해야한다고 생각합니다. 따라서 귀하의 경우에 제 생각에는 Mediator 이전의 expect.call 라인을 이동해야한다는 것입니다.
[TestInitialize()]
public void MyTestInitialize()
{
form = MockRepository.GenerateMock<IAddAddressForm>();
// Make the properties work like a normal property
Expect.Call(form.OKButtonEnabled).PropertyBehavior();
//I tried this too. I still get the exception
//SetupResult.For(form.OKButtonEnabled).PropertyBehavior();
MockRepository.ReplyAll();
mediator = new AddAddressMediator(form);
}
나는 전화하려고했을 때이 문제를 해결했다. internal
C#의 객체의 속성 (getter 만 해당). 이 경우 추가 .PropertyBehavior()
도움이되지 않았습니다.
내 해결책은 속성과 내부 방법으로 논리를 추출 하여이 방법에 종속성을 주입하는 것이 었습니다 (매개 변수).