Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Rhino Mocks异常预期#1实际#0:需要帮助_C#_Exception_Rhino Mocks - Fatal编程技术网

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"))