Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何为调用其他服务的方法编写单元测试_C#_Unit Testing_Moq_Mstest - Fatal编程技术网

C# 如何为调用其他服务的方法编写单元测试

C# 如何为调用其他服务的方法编写单元测试,c#,unit-testing,moq,mstest,C#,Unit Testing,Moq,Mstest,我有一个调用另一个服务的方法,但是在调用内部服务之前有一些数据操作。请看下面 public async Task<myObject> Save(string server,string username, myObject element) { string temp = element.Class + "_" + element.Description + "_" + username;

我有一个调用另一个服务的方法,但是在调用内部服务之前有一些数据操作。请看下面

   public async Task<myObject> Save(string server,string username, myObject element)
            {
                string temp = element.Class + "_" + element.Description + "_" + username;
                var saveData = new string[] { element.Name, temp};
                var response = await datService.save(server, saveData);
                var result = response.TomyObject(); // this is the extension method to convert response to myObject. 
                return result ;
            }

以下是测试扩展方法的方法:

anotherObject响应=新建另一个对象
{
Name=“TestName”,
MyArray=新对象数组
{
P1=“Val1_Val2”
}
};
var result=response.TomyObject();
Assert.Equal(“TestName”,result.Name);
Assert.Equal(“Val1”,result.Class);
Assert.Equal(“Val2”,result.Description);
关键是让单元测试只测试一个工作单元。如果要测试扩展方法,请单独为其编写测试。一旦开始包含多个工作单元(即
IDataService
),您实际上是在测试一个系统,它将成为一个集成测试

更新:

在您的
Save\u Success
测试的这一行:

//断言
AreEqual(response.MyArray.P0,result.Class);
实际上,您正在测试的内容不是
Save
方法的责任(设置
Class
属性实际上是
TomyObject
的责任,可以单独测试)

要验证
Save
方法是否执行了它应该执行的操作,可以执行以下操作:

//断言
datService.Verify(x=>x.Save(It.IsAny(),It.IsAny()),Times.one);

这样,您只需测试
Save
方法是否正在执行它明确负责的操作。

为什么要存根
datService,如果原始方法调用
datService.Save
,则执行
?这是否回答了您的问题?对不起,那是打字错误。我改了这个帖子的名字。我修复了它。我的主要困惑是由于扩展方法,我是否安排来自dataService的响应,以便我的扩展方法给出我期望的结果(就像我在测试中所做的那样),或者有其他方法来实现这一点?什么扩展方法?在代码中找不到任何C#扩展。那么我进行单元测试的方法正确吗?我可以安排IDataService的响应以获得预期结果吗?然后对扩展方法进行不同的单元测试?@user2918107我在答案中添加了一些额外的信息。希望这对我很有帮助,谢谢你,这就是我一直在寻找的。
public async Task Save_Success()
        {
            //ARRANGE         
            var element = new myObject
            {
                Name = "Test",
                Description = "Test Save", 
                Class = "test class"


            };
            string temp = element.Class+ "_" + element.Description + "_" + username;
            var saveData = new string[] { element.Name, temp};
            var response = new anotherObject
            {

                Name= "Test",              
                MyArray = new objArray
                {
                    P0 = saveData[0],
                    P1 = saveData[1]                   

                },
                Error = ""

            };




            var datService = new Mock<IDataService>();
            datService.Setup(x => x.Save(It.IsAny<string>(), It.IsAny<string[]>()).Returns(Task.FromResult(response));
            var myClass = new MyClass(datService.Object);
            //ACT
            var result = await myClass.Save("testServer","testUser", element);
            // ASSERT
            Assert.AreEqual(response.MyArray.P0, result.Class);
        }
 public static myObject TomyObject(this anotherObject response)
        {
            var entity = new myObject();

            entity.Name = response.Name;           
           if(response.MyArray!= null && response.MyArray.P1 != "")
            {
                string[] details = response.MyArray.P1.Split('_');
                entity.Class = details[0];
                entity.Description = details[1];


            }

            return entity;

        }