首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模拟在.NET NMock2中向列表添加项

模拟在.NET NMock2中向列表添加项
EN

Stack Overflow用户
提问于 2017-12-08 01:08:51
回答 1查看 382关注 0票数 1

我在单元测试中使用NMock2 (2.1.3641.27570)。

IList<MyObj> values = _mock.NewMock<IList<MyObj>>();

当测试对象调用模拟对象上的Values get属性时,将返回该模拟:

Expect.AtLeastOnce.On(_myKeepMock).GetProperty("Values").Will(Return.Value(values));

然后,我希望将value ( MyObj )添加到列表values中。

Expect.AtLeastOnce.On(values).Method("Add").With(value);

为了避免在执行时使用unexpected invocation of list'1.Add,我理解必须重写MyObj类中的Equals方法:

public override bool Equals(object obj) { ...}

用价值来比较,而不是参照。但是它在执行测试时甚至没有被调用(断点没有命中)。

当添加到调用中的列表的项与被测试对象添加的项的值相等时,我需要做什么才能通过测试?

我读过一些关于定制配对的文章,但不确定这些是否适用于此。

更新

完整的例子:

代码语言:javascript
复制
using System.Collections.Generic;
using System.Linq;
using NMock2;
using NUnit.Framework;

public class Data
{
    public int Val { get; set; }

    public Data(int val) { Val = val; }


}
public class ModData
{
    public int Val { get; set; }


    protected bool Equals(ModData other)
    {
        return this.Val.Equals(other.Val);
    }

    public override int GetHashCode()
    {
        return this.Val.GetHashCode();
    }

    public override bool Equals(object obj)
    {
        ModData m = (ModData)obj;

        return m != null && this.Val == m.Val;
    }

}


public interface IAllData
{
    IList<Data> Data { get; set; }
    IList<ModData> ModData { get; set; }
}

public class AllData : IAllData
{
    public IList<Data> Data { get; set; }
    public IList<ModData> ModData { get; set; }


}

public class Calco
{
    private IAllData _allData;

    public Calco(IAllData allData)
    {
        _allData = allData;
    }

    public void Sum()
    {
        _allData.ModData.Add(new ModData { Val = _allData.Data.Sum(d => d.Val) });
    }
}





public class CalcoTest
{
    [Test]
    public void Test()
    {
        Mockery mockery = new Mockery();
        IList<Data> data = new List<Data>();
        IList<ModData> modData = mockery.NewMock<IList<ModData>>();
        IAllData allData = mockery.NewMock<IAllData>();

        ModData modDatum = new ModData { Val = 4 };

        data.Add(new Data(1));
        data.Add(new Data(10));

        Calco c = new Calco(allData);



        Expect.AtLeastOnce.On(allData).GetProperty("Data").Will(Return.Value(data));
        Expect.AtLeastOnce.On(allData).GetProperty("ModData").Will(Return.Value(modData));
        Expect.AtLeastOnce.On(modData).Method("Add").With(modDatum);

        c.Sum();

        mockery.VerifyAllExpectationsHaveBeenMet();

    }
}

输出:

代码语言:javascript
复制
NMock2.Internal.ExpectationException : unexpected invocation of list`1.Add(<WRM.Common.RiskCalculation.Tests.ModData>)
Expected:   
  at least 1 time: allData.Data, will return <System.Collections.Generic.List`1[WRM.Common.RiskCalculation.Tests.Data]> [called 1 time]
  at least 1 time: allData.ModData, will return <list`1> [called 1 time]
  at least 1 time: list`1.Add(equal to <WRM.Common.RiskCalculation.Tests.ModData>) [called 0 times]

注意它期望调用list'1.Add(<WRM.Common.RiskCalculation.Tests.ModData>),然后显示它没有调用list'1.Add(<WRM.Common.RiskCalculation.Tests.ModData>)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-08 02:45:11

自定义匹配是答案:http://nmock.sourceforge.net/advanced.html

代码语言:javascript
复制
public class IsMod
{
    public static Matcher Equal(ModData otherMod)
    {
        return new ModMatcher(otherMod);
    }
}

internal class ModMatcher : Matcher
{
    private readonly ModData _mod;

    public ModMatcher(ModData mod)
    {
        _mod = mod;
    }

    public override bool Matches(object o)
    {

        ModData m = (ModData)o;
        return _mod.Val.Equals(m.Val);
    }

    public override void DescribeTo(TextWriter writer)
    {
        writer.Write("Value same ");
        writer.Write(_mod.Val);
    }
}

然后

代码语言:javascript
复制
Expect.AtLeastOnce.On(modData).Method("Add").With(IsMod.Equal(modDatum));

完成了!

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

https://stackoverflow.com/questions/47706278

复制
相关文章

相似问题

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