首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用Moq验证参考参数的值

使用Moq验证参考参数的值
EN

Stack Overflow用户
提问于 2009-04-07 16:50:26
回答 2查看 21K关注 0票数 18

我刚刚切换到Moq,遇到了一个问题。我正在测试一个方法,该方法创建一个业务对象的新实例,根据用户输入值设置对象的属性,并调用一个方法(SaveCustomerContact )来保存新对象。业务对象作为ref参数传递,因为它通过远程处理层。我需要测试传递给SaveCustomerContact的对象是否按预期设置了所有属性,但因为它在控制器方法中被实例化为new,所以似乎无法这样做。

代码语言:javascript
复制
public void AddContact() {

    var contact = new CustomerContact() { CustomerId = m_model.CustomerId };

    contact.Name = m_model.CustomerContactName;
    contact.PhoneNumber = m_model.PhoneNumber;
    contact.FaxNumber = m_model.FaxNumber;
    contact.Email = m_model.Email;
    contact.ReceiveInvoiceFlag = m_model.ReceiveInvoiceFlag;
    contact.ReceiveStatementFlag = m_model.ReceiveStatementFlag;
    contact.ReceiveContractFlag = m_model.ReceiveContractFlag;
    contact.EmailFlag = m_model.EmailFlag;
    contact.FaxFlag = m_model.FaxFlag;
    contact.PostalMailFlag = m_model.PostalMailFlag;
    contact.CustomerLocationId = m_model.CustomerLocationId;

    RemotingHandler.SaveCustomerContact( ref contact );
}

下面是测试结果:

代码语言:javascript
复制
[TestMethod()]
public void AddContactTest() {

    int customerId = 0;

    string name = "a";

    var actual = new CustomerContact();

    var expected = new CustomerContact() {
        CustomerId = customerId,
        Name = name
    };

    model.Setup( m => m.CustomerId ).Returns( customerId );
    model.SetupProperty( m => model.CustomerContactName, name );
    model.SetupProperty( m => m.PhoneNumber, string.Empty );
    model.SetupProperty( m => m.FaxNumber, string.Empty );
    model.SetupProperty( m => m.Email, string.Empty );
    model.SetupProperty( m => m.ReceiveInvoiceFlag, false );
    model.SetupProperty( m => m.ReceiveStatementFlag, false );
    model.SetupProperty( m => m.ReceiveContractFlag, false );
    model.SetupProperty( m => m.EmailFlag, false );
    model.SetupProperty( m => m.FaxFlag, false );
    model.SetupProperty( m => m.PostalMailFlag, false );
    model.SetupProperty( m => m.CustomerLocationId, 0 );

    remote
        .Setup( r => r.SaveCustomerContact( ref actual ) )
        .Callback( () => Assert.AreEqual( actual, expected ) );

    target.AddContact();

}

这只是获取该参数的众多尝试中的最新一次。作为参考,actual的值不会从其初始(构造)状态更改。

在目标调用失败后移动Assert.AreEqual(预期的,实际的)。如果我将.Verifiable()而不是.CallBack添加到设置中,然后在目标之后调用remote.Verify (或者,我假设将模拟设置为strict),它总是失败,因为我在测试中提供的参数与在控制器方法中创建的参数不是同一个实例。

我正在使用Moq 3.0.308.2。任何关于如何测试这方面的想法都将不胜感激。谢谢!

EN

回答 2

Stack Overflow用户

发布于 2009-04-19 20:41:23

最新版本的Moq支持此场景。

取自http://code.google.com/p/moq/wiki/QuickStart的快速入门

代码语言:javascript
复制
// ref arguments
var instance = new Bar();
// Only matches if the ref argument to the invocation is the same instance
mock.Setup(foo => foo.Submit(ref instance)).Returns(true);
票数 10
EN

Stack Overflow用户

发布于 2013-04-06 02:14:28

我也遇到过类似的问题。Bit我通过使用最新的Moq并传递如下值得到了解决方案

var实例= new Bar();Mock.Setup(foo => foo.Submit(引用实例)).Returns(True);

早些时候,我也使用了同样的方法,但我没有得到正确的结果。

在实际的函数实例中,正在创建并覆盖从单元测试类传递的实例,这导致了问题。我删除了实际类中的实例创建,然后它就可以工作了。

希望能对你有所帮助。

谢谢

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/726630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档