C# Rhino Mocks异常预期#1实际#0:需要帮助
我已经搜索了这个,它似乎是一个包罗万象,不幸的是,我读到的所有东西都不能帮助我找到答案。下面是课堂:C# Rhino Mocks异常预期#1实际#0:需要帮助,c#,exception,rhino-mocks,C#,Exception,Rhino Mocks,我已经搜索了这个,它似乎是一个包罗万象,不幸的是,我读到的所有东西都不能帮助我找到答案。下面是课堂: public interface IMockInterface { MockClass MockedMethod(); MockClass MockThis(); } public class MockClass : IMockInterface { public virtual MockClass MockedMethod() { MockClass retu
public interface IMockInterface
{
MockClass MockedMethod();
MockClass MockThis();
}
public class MockClass : IMockInterface
{
public virtual MockClass MockedMethod()
{
MockClass returnValue;
returnValue = new MockClass();
returnValue.SomeMessage = "Not mocked";
return returnValue;
}
public MockClass MockThis()
{
MockClass mock;
MockClass returnValue;
mock = new MockClass();
return mock.MockedMethod();
}
}
以及测试:
public void MockTest_Internal()
{
MockClass mainClass;
MockClass returnedClass;
IMockInterface mockProvider;
mainClass = new MockClass();
mockProvider = repository.StrictMock<IMockInterface>();
Expect.Call(mockProvider.MockedMethod())
.Return(new MockClass { SomeMessage = "Mocked" });
repository.ReplayAll();
returnedClass = mainClass.MockThis();
provider.AssertWasCalled(item => item.MockedMethod());
Assert.IsTrue(returnedClass.SomeMessage == "Mocked");
}
public void MockTest_Internal()
{
MockClass主类;
MockClass返回类;
iMockProvider;
mainClass=新的MockClass();
mockProvider=repository.StrictMock();
Expect.Call(mockProvider.MockedMethod())
.Return(新MockClass{SomeMessage=“Mocked”});
ReplayAll();
returnedClass=mainClass.MockThis();
调用provider.assertwas(item=>item.MockedMethod());
Assert.IsTrue(returnedClass.SomeMessage==“Mocked”);
}
并且也尝试过但没有成功
但我一直得到这样一个例外:
Rhino.Mocks.Exceptions.ExpectationViolationException:IMockInterface.MockedMethod();预期为1,实际为0 现在,从我所读到的内容来看,这表明要么调用方法时使用了不同于预期的参数,要么从未调用该方法,但预期将调用该方法。这不是测试的情况 旁注:这是我第一次真正使用Rhino。Mock没有一些内部代码,所以我基本上是边走边捡。这里可能有一些非常愚蠢的事情 这是之前评论过的测试,但不是我应该使用的:
public void MockTest_Internal()
{
MockClass mainClass;
MockClass returnedClass;
IMockInterface mockProvider;
mainClass = new MockClass();
var provider = MockRepository.GenerateStub<IMockInterface>();
provider.Stub(item => item.MockedMethod())
.Return(new MockClass { SomeMessage = "Mocked" });
returnedClass = mainClass.MockThis();
provider.AssertWasCalled(item => item.MockedMethod());
Assert.IsTrue(returnedClass.SomeMessage == "Mocked");
}
public void MockTest_Internal()
{
MockClass主类;
MockClass返回类;
iMockProvider;
mainClass=新的MockClass();
var provider=MockRepository.GenerateStub();
provider.Stub(item=>item.MockedMethod())
.Return(新MockClass{SomeMessage=“Mocked”});
returnedClass=mainClass.MockThis();
调用provider.assertwas(item=>item.MockedMethod());
Assert.IsTrue(returnedClass.SomeMessage==“Mocked”);
}
您告诉mock框架在provider对象上存根MockedMethod类,但您从未将provider注入要使用的mainClass对象。我不清楚您试图实现什么,但是如果您希望调用模拟方法,那么必须在设置存根的对象上调用它
如果您将MockThis
定义如下,我想您会发现它会起作用
public MockClass MockThis(IMockInterface provider)
{
return provider.MockMethod();
}
底线是您得到了异常,因为该方法从未在提供程序上调用过,只在mainClass对象上调用过
编辑:示例
public class ClassUnderTest
{
private ProviderClass provider { get; set; }
public ClassUnderTest( ProviderClass provider )
{
this.Provider = provider;
}
public int DoOperation()
{
return this.Provider.ProviderOperation();
}
}
public class ProviderClass
{
private int value = 42;
public ProviderClass()
{
}
public virtual int ProviderOperation()
{
return this.value;
}
}
[TestMethod]
public void DoOperationTest()
{
ProviderClass mockProvider = MockRepository.GenerateMock<ProviderClass>();
mockProvider.Expect( mp => mp.ProviderOperation() ).Return( -1 );
ClassUnderTest target = new ClassUnderTest( mockProvider );
int expectedValue = -1;
int value = target.DoOperation();
Assert.AreEqual( expectedValue, value );
mockProvider.VerifyAllExpectations();
}
测试中的公共类
{
私有ProviderClass提供程序{get;set;}
测试中的公共类(ProviderClass提供程序)
{
this.Provider=Provider;
}
公共内部操作()
{
返回此.Provider.ProviderOperation();
}
}
公共类ProviderClass
{
私有int值=42;
公共ProviderClass()
{
}
公共虚拟int ProviderOperation()
{
返回此.value;
}
}
[测试方法]
公开测试()
{
ProviderClass mockProvider=MockRepository.GenerateMock();
Expect(mp=>mp.ProviderOperation()).Return(-1);
ClassUnderTest目标=新的ClassUnderTest(mockProvider);
int expectedValue=-1;
int value=target.DoOperation();
Assert.AreEqual(expectedValue,value);
mockProvider.verifyAllExpections();
}
通常,ProviderClass对象将从ProviderOperation方法返回42,但我们已经模拟了它并告诉它返回-1。调用ClassUnderTest DoOperation方法时,将调用模拟提供程序对象的ProviderOperation方法,并返回模拟值-1
希望这能有所帮助。当使用我在测试中生成的对象参数调用存根方法时,我通常会遇到此错误,在测试代码中,对象是在调用该方法之前生成的。解决方案是使用
Rhino.Mocks Matches()
例:
Arg.Matches(s=>s.Contains(“某些子字符串”))
我只是想创建一个垃圾类来学习如何模仿。基本上,我创建这个类是为了有一个方法,该方法将在一个方法中被调用并返回一些东西。您正在测试的代码需要直接使用mocked对象,以便调用stubbed/mocked方法。现在我只是一个白痴小孩,试图把一架飞机和一盒零件组装在一起。好吧,第一个测试例子是坏的,正如你们所说的。存根不是我需要的。然而,我有第二个例子仍然不起作用。回答了一个问题,只带来了更多。
Arg<string>.Matches(s => s.Contains("some substring"))