Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.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
Unit testing Microsoft使用SQL代码在c#方法上伪造(垫片和/或存根)_Unit Testing_Visual Studio 2012_Shim_Microsoft Fakes_Stubs - Fatal编程技术网

Unit testing Microsoft使用SQL代码在c#方法上伪造(垫片和/或存根)

Unit testing Microsoft使用SQL代码在c#方法上伪造(垫片和/或存根),unit-testing,visual-studio-2012,shim,microsoft-fakes,stubs,Unit Testing,Visual Studio 2012,Shim,Microsoft Fakes,Stubs,我正在尝试学习更多关于单元测试的知识,使用开箱即用的功能(我相信它是MSTest.exe)和Microsoft Fakes(存根和垫片) 我正在使用Visual Studio 2012 Ultimate和.Net 4.5框架 给定以下调用存储过程(SQL Server)的代码,该存储过程返回单个输出值(为简单起见): 是否可以使用垫片和/或短棒进行测试,以便将输出值设置为特定值 如果是,怎么做 我应该为此使用单元测试吗 我已经遵循并设法理解它,并使之适应一周中的每一天 我正在等待VS2012数据

我正在尝试学习更多关于单元测试的知识,使用开箱即用的功能(我相信它是MSTest.exe)和Microsoft Fakes(存根和垫片)

我正在使用Visual Studio 2012 Ultimate和.Net 4.5框架

给定以下调用存储过程(SQL Server)的代码,该存储过程返回单个输出值(为简单起见):

  • 是否可以使用垫片和/或短棒进行测试,以便将输出值设置为特定值
  • 如果是,怎么做
  • 我应该为此使用单元测试吗
  • 我已经遵循并设法理解它,并使之适应一周中的每一天


    我正在等待VS2012数据库单元测试功能作为MS员工在2012年底可用(或恢复),以便可以单独测试数据库。

    Microsoft Fakes不是测试此代码的合适工具。而是创建一个集成测试。在此测试中,使用SQL server的本地实例,显式创建存储过程希望在数据库中找到的数据,调用存储过程并验证其结果。回滚事务或手动从数据库中删除数据,以确保它不会影响其他测试

    为什么不呢?通过填充
    command.ExecuteNonQuery()
    您可以在不需要访问数据库的情况下测试很多此方法及其错误处理。可能还需要填充
    连接。Open()
    。这不会使这个方法易于测试,但这是一个开始,方法本身几乎没有逻辑。它主要是围绕存储过程的管道。你能用垫片测试一下吗?对这些测试有价值吗?在我看来,不是。我要么直接对存储过程进行单元测试,要么作为代理对包装器方法进行集成测试。我怀疑
    GetSomeDatabaseValue
    不是实际的方法:)。如果真的没有什么逻辑,那么我就不会花太多时间来测试它。我怀疑还有更多。至少你可以检查连接是否正确关闭,对象是否被正确处理等等,除非你已经运行了一个静态分析工具来为你做这些。这根本不能回答问题。这只是你的意见,应该删除。
    public string GetSomeDatabaseValue()
    {
        string someValue = String.Empty;
    
        SqlParameter paramater = new SqlParameter();
        paramater.ParameterName = "@SomeParameter";
        paramater.Direction = ParameterDirection.Output;
        paramater.SqlDbType = SqlDbType.NVarChar;
        paramater.Size = 50;  
    
        try
        {
            using(SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["connection"].ConnectionString))
            {
                using (SqlCommand command = new SqlCommand())
                {
                    command.Connection = connection;
                    command.CommandType = System.Data.CommandType.StoredProcedure;
                    command.CommandText = "SomeStoredProcedure";
                    command.Parameters.Add(paramater);
    
                    connection.Open();
                    command.ExecuteNonQuery();
    
                    if (command.Parameters["@SomeParameter"] != null)
                    {
                        someValue= Convert.ToString(command.Parameters["@SomeParameter"].Value);
                    }
                }
            }
        }
        catch(SqlException)
        {
            throw;
        }
    
        return someValue;
    }