Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.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# 为什么RhinoMocks在我的测试中抛出一个InvalidoOperation异常?_C#_.net_Unit Testing_Tdd_Rhino Mocks - Fatal编程技术网

C# 为什么RhinoMocks在我的测试中抛出一个InvalidoOperation异常?

C# 为什么RhinoMocks在我的测试中抛出一个InvalidoOperation异常?,c#,.net,unit-testing,tdd,rhino-mocks,C#,.net,Unit Testing,Tdd,Rhino Mocks,这是我目前正在进行的一项测试: (根据李氏答案编辑) 在中运行测试结果: Test 'Test.Unit.Controllers.LockClassPanelControllerTests.AddLockWithNullNameClassShouldCallInsertOnSessionWithEmptyString' failed: System.InvalidOperationException : The operation is invalid because of the curre

这是我目前正在进行的一项测试:
(根据李氏答案编辑)

在中运行测试结果:

Test 'Test.Unit.Controllers.LockClassPanelControllerTests.AddLockWithNullNameClassShouldCallInsertOnSessionWithEmptyString' failed:
 System.InvalidOperationException : The operation is invalid because of the current object state. (translated from german, dunno if thats the original english wording)
 at System.Reflection.RuntimeMethodInfo.GetGenericMethodDefinition()
 at Rhino.Mocks.MethodRecorders.UnorderedMethodRecorder.MethodsEquals(MethodInfo method, ProxyMethodExpectationTriplet triplet)
 at Rhino.Mocks.MethodRecorders.UnorderedMethodRecorder.GetAllExpectationsForProxyAndMethod(Object proxy, MethodInfo method)
 at Rhino.Mocks.MethodRecorders.UnorderedMethodRecorder.CalcExpectedAndActual.Calculate(Object proxy, MethodInfo method, Object[] args)
 at Rhino.Mocks.MethodRecorders.UnorderedMethodRecorder.CalcExpectedAndActual..ctor(UnorderedMethodRecorder parent, Object proxy, MethodInfo method, Object[] args)
 at Rhino.Mocks.MethodRecorders.UnorderedMethodRecorder.UnexpectedMethodCall(IInvocation invocation, Object proxy, MethodInfo method, Object[] args)
 at Rhino.Mocks.MethodRecorders.UnorderedMethodRecorder.DoGetRecordedExpectation(IInvocation invocation, Object proxy, MethodInfo method, Object[] args)
 at Rhino.Mocks.MethodRecorders.MethodRecorderBase.GetRecordedExpectation(IInvocation invocation, Object proxy, MethodInfo method, Object[] args)
 at Rhino.Mocks.Impl.ReplayMockState.DoMethodCall(IInvocation invocation, MethodInfo method, Object[] args)
 at Rhino.Mocks.Impl.ReplayMockState.MethodCall(IInvocation invocation, MethodInfo method, Object[] args)
 at Rhino.Mocks.MockRepository.MethodCall(IInvocation invocation, Object proxy, MethodInfo method, Object[] args)
 at Rhino.Mocks.Impl.RhinoInterceptor.Intercept(IInvocation invocation)
 at Castle.DynamicProxy.AbstractInvocation.Proceed()
 at ISessionProxy2762dfaac4274133bc97e10d4e5c35d0.InsertWithId[TEntity](TEntity entity)
 Controllers\LockClassPanelController.cs(20,0): at Artea.Service.Controllers.LockClassPanelController.AddLockClass(Int32 id, String name)
 Unit\Controllers\LockClassPanelControllerTests.cs(80,0): at Test.Unit.Controllers.LockClassPanelControllerTests.AddLockWithNullNameClassShouldCallInsertOnSessionWithEmptyString()
有什么想法吗

编辑:
我刚刚发现,如果改变方法的第一行,它可以正常工作:

LockClass lockClass = new LockClass { Id = ValidId, Name = string.Empty };
string.Empty
而不是
null
) 但是测试应该检查
Name
属性为null时会发生什么,因此将
Name
设置为除
null
之外的任何属性都不会有很大帮助

编辑:
代码实际上并没有测试我想要测试的东西。方法的第一行应该是

LockClass lockClass = new LockClass { Id = ValidId, Name = string.Empty };
controller.AddLockClass( lockClass.Id, null );
这是我期望的目标
LockClass
是一个DTO,只有在上面一行中初始化的两个属性,并且必须的
等于
stuff。
行动路线应该是

LockClass lockClass = new LockClass { Id = ValidId, Name = string.Empty };
controller.AddLockClass( lockClass.Id, null );
[设置]创建所有模拟对象。我试图测试的是,如果用户通过GUI手势(GUI在控制器上调用
AddLockClass
)创建一个LockClass对象,其中名称为null,那么控制器将创建一个名称为空的对象。还有其他方法可以做到这一点,但现在必须是这样。更改后的代码确实有效(例如Rhino不会呕吐)。我仍然保留这个问题,因为很奇怪为什么Rhino不喜欢原始代码

要使其完整:

private const int ValidId = 4711;
private const int InvalidId = 0;
private MockRepository mockRepository;
private ISessionFactory sessionFactory;
private ISession session;
private LockClassPanelController controller;

[SetUp]
public void Setup()
{
    mockRepository = new MockRepository();
    sessionFactory = mockRepository.StrictMock<ISessionFactory>();
    session = mockRepository.StrictMock<ISession>();
}

我认为您需要将测试的“act”部分包含在回放范围内:

using(mockRepository.Playback())
{
    controller = new LockClassPanelController( sessionFactory ); 
    controller.AddLockClass( lockClass.Id, string.Empty );
}

mockRepository.VerifyAll();

Rhino Mocks为您提供了正确的异常。在AddLockClass中,您有以下行:

session.InsertWithId( new LockClass { Id = id, Name = ( name ?? string.Empty ) } );
这清楚地表明,如果使用null name参数调用此方法,则在创建LockClass实例时它仍将使用空字符串。因此,正如您在问题的第一次编辑中所注意到的,您在测试中应该期望的LockClass是:

LockClass lockClass = new LockClass { Id = ValidId, Name = string.Empty };

而不是空值的版本。如果需要进一步说明,请告诉我。

controller.AddLockClass(lockClass.Id,string.Empty);controller.AddLockClass()的签名是什么?什么是sessionFactory?什么是会话?它们是在哪里创建的?它们也是模拟的吗?除了LockClassPanelController之外的所有东西都是模拟的(毕竟这是一个单元测试)
AddLockClass(int-id,string-name)
sessionFactory是一个ISessionFactory,用于创建会话(ISession、DB访问会话、手动DAL)。但这并不重要,因为它们无论如何都会被嘲笑。它真的还会抛出同样的异常吗?你能粘贴AddLockClass方法的代码吗?它仍然抛出相同的异常。
??string.Empty
不应该存在(我将编辑它)。请阅读我的各种编辑。测试的整个语义都是错误的(不是我想要测试的)。但仍然令人好奇的是,为什么犀牛会抛出这个例外。它不应该关心Name属性是否为null。它非常简单。设置期望会话。InsertWithId(lockClass);LastCall.Return(lockClass);Rhino正好需要这个调用,并将使用Equals方法比较参数(lock类)。这就是为什么它的null或空字符串很重要。我不确定在不比较参数的情况下,您希望如何测试它。Grzenio是正确的。您设置了一个期望,即将返回一个特定的LockClass,但在您的方法中,您创建了一个LockClass的新实例。因此,测试失败。我不知道你为什么会有例外。我试图使用Rhino.Mocks 3.5创建一个完整的测试,但我得到了一个失败的测试,而不是一个异常:LockClass实现了Equals(),因此具有相同id和相同名称的两个实例被认为是相等的。您使用MsTest实现了测试。也许这是努伊特的问题。我将尝试创建一个独立的设置来重现异常。