如何在Moq中更改输入参数?

11
考虑。
var list = new List<string>();
someObject.AddOne(list);
Assert.AreEqual(1, list.Count);

我该如何设置我的模拟环境?我期望……

var mock = new Mock<SomeObject>();
var list = new List<string>();
mock
    .Setup(so => so.AddOne(list))
    .Callback<List<string>>(l => l.Add("derp"));

可以工作,但回调函数未被调用。

由于这是我使用的外部 API,因此我不能更改 SomeObject。


为什么需要模拟输入?如果您需要测试向列表添加内容,您只需要模拟输出参数即可。 - Dmitriy Kovalenko
1个回答

23

这个测试将会成功:

using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;
using System.Collections.Generic;

namespace UnitTestProject
{
    [TestClass]
    public class UnitTest
    {
        public class SomeObject
        {
            public virtual void AddOne(List<string> aList) { }
        }

        [TestMethod]
        public void SomeTest()
        {
            // Arrange
            var mock = new Mock<SomeObject>();

            mock.Setup(so => so.AddOne(It.IsAny<List<string>>()))
                .Callback<List<string>>(l => l.Add("derp"));

            var target = mock.Object;
            var list = new List<string>();

            // Act
            target.AddOne(list);

            // Assert
            Assert.IsTrue(list.Contains("derp"));            
        }
    }
}

3
当有两个参数并且您只想向第二个参数添加一个条目而不更改第一个参数时,语法是什么样子? - Janneman96
2
@Janneman96,请看一下这个的SO问题。 - Jeroen Heier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接