首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Mock.Assert()在模拟具有不同参数值的顺序调用时遇到的问题

Mock.Assert()在模拟具有不同参数值的顺序调用时遇到的问题
EN

Stack Overflow用户
提问于 2015-03-30 17:05:59
回答 2查看 364关注 0票数 0

请有人看看下面的演示代码,让我知道我看到的是我的错误或一个Telerik问题?

我使用的是Telerik.JustMock诉2014.1.1519.1。以及Microsoft.VisualStudio.QualityTools.UnitTestFramework诉10.0.0.0。

正如代码注释所指出的,当id变量相等时(每个id调用一次),但当id变量不同时,我就会得到预期的结果。当我通过第一个测试时,我可以看到预期的调用正在进行,但是JustMock告诉我它们没有发出。

我会感激任何建设性的想法。希望这不是我睡眠不足的情况..。

代码语言:javascript
运行
复制
[TestClass]
public class RunnerTests
{
[TestMethod]
public void MakeTwoCallsDifferentIdsFails()
{
    int idOne=1;
    int idTwo=2;

    DataTable dt=new DataTable();
    dt.Columns.Add("Id");
    dt.Rows.Add(idOne);
    dt.Rows.Add(idTwo);

    IProcessor mock = Mock.Create<IProcessor>();
    Runner runner = new Runner(mock);
    runner.Process(dt);

    Mock.Assert(()=>mock.Process(Arg.IsAny<MyArgs>()), Occurs.Exactly(2));
    //The following two asserts fail (with 0 calls made to mock), regardless of sequence:
    Mock.Assert(()=>mock.Process(Arg.Matches<MyArgs>     
       (d=>d.Id==idOne)),Occurs.Once());
    Mock.Assert(()=>mock.Process(Arg.Matches<MyArgs>
       (d=>d.Id==idTwo)),Occurs.Once());
}

[TestMethod]
public void MakeTwoCallsSameIdPasses()
{
    //ids intentionally equal:
    int idOne=1;
    int idTwo=1;

    DataTable dt=new DataTable();
    dt.Columns.Add("Id");
    dt.Rows.Add(idOne);
    dt.Rows.Add(idTwo);

    IProcessor mock = Mock.Create<IProcessor>();
    Runner runner = new Runner(mock);
    runner.Process(dt);

    //all asserts pass:
    Mock.Assert(()=>mock.Process(Arg.IsAny<MyArgs>()), Occurs.Exactly(2));
    //The following two pass:
    Mock.Assert(()=>mock.Process(Arg.Matches<MyArgs>     
        (d=>d.Id==idOne)),Occurs.Exactly(2));
    Mock.Assert(()=>mock.Process(Arg.Matches<MyArgs>
        (d=>d.Id==idTwo)),Occurs.Exactly(2));
}
}

public interface IProcessor
{
    void Process(MyArgs args);
}

public class MyArgs
{
    public void UpdateId(int newId)
    {
        this.Id = newId;
    }

    public int Id {get; private set;}
}

public class Runner
{
    private IProcessor processor;

    public Runner(IProcessor processor)
    {
        this.processor=processor;
    }

    public void Process(DataTable dt)
    {
        MyArgs args = new MyArgs();

        foreach(DataRow row in dt.Rows)
        {
            int id = Convert.ToInt32(row["Id"]);
            args.UpdateId(id);
            processor.Process(args);
        }
    }
}

编辑:在失败的测试方法中,如果我完全删除一个int变量并显式断言另一个变量只调用了一次,测试就会通过。只有当我把第二个,不同的价值加到一起的时候,事情才会变得更糟。

EN

Stack Overflow用户

回答已采纳

发布于 2015-03-31 17:10:27

由于无法让我们选择的模拟框架(JustMock)实现我想要的结果,所以我最终应用了接吻,忘记了这个测试的模拟框架,并进行了如下操作:

我改变了我的测试方法,如下所示:

代码语言:javascript
运行
复制
    [TestMethod]
    public void TwoCallsDifferentIds()
    {
        int idOne = 1;
        int idTwo = 2;

        DataTable dt = new DataTable();
        dt.Columns.Add("Id");
        dt.Rows.Add(idOne);
        dt.Rows.Add(idTwo);
        FakeProcessor processor = new FakeProcessor();
        Runner runner = new Runner(processor);
        runner.Process(dt);

        Assert.AreEqual(2, processor.MyArgsIds.Count);
        Assert.AreEqual(1, processor.MyArgsIds[0]);
        Assert.AreEqual(2, processor.MyArgsIds[1]);
    }

并添加了以下假的:

代码语言:javascript
运行
复制
public class FakeProcessor : IProcessor
{
    private IList<int> mList = new List<int>();

    public IList<int> MyArgsIds 
    {
        get { return mList; }
    }

    public void Process(MyArgs args)
    {
        mList.Add(args.Id);
    }
}

也许没那么聪明,但它给了我我想要的考试。

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

https://stackoverflow.com/questions/29352091

复制
相关文章

相似问题

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