【问题标题】:RhinoMock AssertWasCalled on same object twiceRhinoMock AssertWasCalled 在同一个对象上两次
【发布时间】:2014-05-10 12:39:20
【问题描述】:

我有一个方法可以将对象添加到数据库,处理该对象,然后如果处理成功,则更新数据库中的同一对象。处理是系统中非常关键的部分(支付),所以我想确保如果在处理过程中系统崩溃/断电,我们仍然有初始添加,然后我们可以再次处理。

public void CreateAndProcess(){
        var myObj= new myObj
        {
            // Set up myObj here
        };

        db.Add(myObj);
        db.SaveChanges();

        // Process and update myObj here

        db.Update(myObj);
        db.SaveChanges();
}

然后我想对 CreateAndProcess 方法进行单元测试,以确保使用包含正确值的 myObj 调用 Add 和 Update 方法。

// addedObj and updatedObj are objects I define in my test that should match.    
_store.AssertWasCalled(store => store.Add(Arg<myObj>.Matches(mo => Equal(mo, addedObj))), 
                       option => option.Repeat.Once()); // Initial add to db
_store.AssertWasCalled(store => store.Update(Arg<myObj>.Matches(mo => Equal(mo, updatedObj))), 
                       option => option.Repeat.Once()); // Update in db after processed

private static bool Equal(myObj s1, myObj s2)
{
   // Used to match a subset of properties I care about
   Assert.That(s1.myProp, Is.EqualTo(s2.myProp), "Unexpected argument");
   return true;
}

问题是第一个 AssertWasCalled 使用的是对象更新后的最终状态,而不是调用 Add() 函数时的值。

如何测试 myObj 在最初添加到数据库时的状态?

谢谢,

【问题讨论】:

  • 您是否使用 GenerateStub 创建 _store 对象?如果是这样,问题可能与此question 有关
  • 是的,我愿意:_store = MockRepostiory.GenerateStub...

标签: c# unit-testing nunit rhino-mocks


【解决方案1】:

Rhino Mock 提供Do() 处理程序来在调用存根方法时访问存根方法参数。
因此,可以为Add(MyObj) 方法编写一个自定义处理程序,该处理程序可以存储传递的myObj 参数的必要字段。然后可以对存储的字段运行断言。

这是一个例子:

string actualMyPropOnAdd = null;

_store
    .Stub(s => s.Add(Arg<MyObj>.Is.Anything))
    .Do((Action<MyObj>)(myObj =>
    {
        // save the necessary properties to validate them later
        actualMyPropOnAdd = myObj.myProp;
    }));

// call CreateAndProcess() here

// validate saved properties:
Assert.That(actualMyPropOnAdd, Is.EqualTo(expectedMyPropOnAdd));

我还建议关注one asser per test rule 并编写另一个单独的测试来验证传递给Update() 方法的参数是否正确。

【讨论】:

    猜你喜欢
    • 2010-09-19
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多