【问题标题】:Linq2Sql - Converting Code - Visual Studio 2012 - Unit TestsLinq2Sql - 转换代码 - Visual Studio 2012 - 单元测试
【发布时间】:2013-12-03 14:41:02
【问题描述】:

我一直在尝试转换下面的代码。我已经尝试过了,我将在下面的代码下方发布尝试。说到这里我很困惑

我必须转换的代码:


[TestMethod]
        public void SRSTransactiondataCleanTest()
        {
            using (SqlConnection sqlConn = new
               SqlConnection(@"Data Source=localhost;Initial Catalog=CorporateDWTest;Integrated Security=SSPI;"))
            {

                StringBuilder str = new StringBuilder();
                str.Append(@"SELECT * FROM [dbo].[SRS_Ticket_Transaction_Stage_Cleaned]");
                sqlConn.Open();
                SqlDataAdapter da = new SqlDataAdapter(str.ToString(), sqlConn);
                DataTable dResults = new DataTable();
                DataTable dAudit = new DataTable();
                da.Fill(dResults);

                da.SelectCommand.CommandText = @"SELECT [Table_Name],[Package_Name],[Execution_Start_Time],[Execution_End_Time],[Processing_Successful], Audit_Key," +
                    @"[Table_Initial_Row_Count],[Table_Final_Row_Count] FROM [SRS_Dim_Audit] WHERE Package_Name LIKE 'SAPSRSDataToStageClean'";

                da.Fill(dAudit);
                var r = dAudit.Rows[0][2].ToString();

                Assert.AreEqual(1, dAudit.Rows.Count);
                Assert.AreEqual("SRS_Ticket_Transaction_Stage_Cleaned", dAudit.Rows[0][0].ToString());
                Assert.AreEqual("SAPSRSDataToStageClean", dAudit.Rows[0][1].ToString());
                Assert.AreEqual(bool.TrueString, dAudit.Rows[0][4].ToString());
                Assert.IsTrue(int.Parse(dAudit.Rows[0][7].ToString()) > 10);
                Assert.IsTrue(dResults.Rows.Count > 50);
                Assert.AreEqual(int.Parse(dAudit.Rows[0][7].ToString()), dResults.Rows.Count);
                Assert.AreEqual(int.Parse(dAudit.Rows[0][5].ToString()), int.Parse(dResults.Rows[0][2].ToString()))
                sqlConn.Close();
            }
       }

我目前所拥有的:

[TestMethod]
        public void SRSTransactiondataCleanTest()
        {
            using (var context = new CorporateDWTestEntities4())
            {
                var stageCleaned = context.SRS_Ticket_Transaction_Stage_Cleaned;
                var auditRecords = context.SRS_Dim_Audit.Where(s => s.Package_Name == "SAPSRSDataToStageClean");
                var auditRecord = auditRecords.FirstOrDefault();

                Assert.AreEqual(1, stageCleaned.Count());
                Assert.AreEqual(auditRecord.Table_Final_Row_Count, stageCleaned.Count());
                Assert.AreEqual(52, auditRecords.Count());
                Assert.AreEqual("SRS_Ticket_Transaction_Stage_Cleaned", auditRecord.Table_Name);
                Assert.AreEqual("SAPSRSDataToStageClean", auditRecord.Package_Name);
                Assert.AreEqual(true, auditRecord.Processing_Successful);
                Assert.IsTrue(auditRecord.Table_Final_Row_Count > 10);

            }
        }

我在代码转换方面还很陌生。我走在正确的轨道上吗?当我运行它时,我收到一条消息:

"Assert.AreEqual failed. Expected <1>. Actual <9461>."

当我将其更改为 9461 时,整个测试通过。这是为什么?我使用了错误的变量吗?我只想知道我编写的代码是否实际上反映了我要转换的代码。我知道用编程语法一定要一丝不苟。我想知道是否有人可以对此进行审查并在必要时进行修改。

附言。行:

  Assert.AreEqual(int.Parse(dAudit.Rows[0][5].ToString()), int.Parse(dResults.Rows[0][2].ToString()));

把我搞糊涂了,这到底是在问我什么?

【问题讨论】:

  • 请注意,这些不是单元测试,它们是集成测试。
  • @KirkWoll 这是一个重要的区别,特别是对于刚接触单元测试的人。我曾与许多客户合作过,他们没有充分理解这种区别,并且对单元测试的实践感到失望,因为他们有大量脆弱的、紧密耦合的集成测试,他们疯狂地试图维护这些测试。
  • Daniel,这甚至与手头的讨论无关。
  • 我同意 Dan 的观点 - 对于刚接触单元测试的人来说,理解集成和单元测试之间的区别有很好的理由,因为理解范围和编写好的单元测试的实践将对设计有显着影响。
  • 这就是为什么我将其发布为评论,而不是作为答案。当有人询问具有漏洞的 SQL 相关问题时,人们发布有关 SQL 注入漏洞的 cmets 的方式相同。这些 cmets 与问题无关,但它仍然是有用的信息。

标签: c# visual-studio-2012 linq-to-sql entity-framework-5 integration-testing


【解决方案1】:

你的第一个测试应该是

 Assert.AreEqual(1, auditRecords.Count());

而不是

Assert.AreEqual(1, stageCleaned.Count());

你也有一个测试

Assert.AreEqual(52, auditRecords.Count());

我看不出你在哪里可以免费获得 52。如果这应该相当于

Assert.IsTrue(dResults.Rows.Count > 50);

那么应该是

Assert.IsTrue(stageCleaned.Count() > 50);

不知道你为什么对这条线感到困惑

 Assert.AreEqual(int.Parse(dAudit.Rows[0][5].ToString()), int.Parse(dResults.Rows[0][2].ToString()));

您必须非常接近,因为您已经计算出所有其他 dAudit.Rows[0][...] 值是什么,所以大概您知道 int.Parse(dAudit.Rows[0][5].ToString()) 代表 auditRecord.Audit_Key(假设它被定义为一个 int)。同样,dResults.Rows[0][2] 将是 SRS_Ticket_Transaction_Stage_Cleaned 表中第一行的第三列。

所以大概这代表了类似的东西

var firstStageRecord = stageCleaned.First();
Assert.IsTrue(auditRecord.Audit_Key , firstStageRecord.xxx); 

其中 xxx 是第三列的名称。

还有一些其他问题需要指出。 如果你多次调用stageCleaned.Count(),每次调用都会发出一条sql命令。

原始代码对 sqlConnection 进行了硬编码,而您的新代码要么使用默认值,要么从配置文件中获取连接,因此您需要检查以确保您正在与正确的数据库通信。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多