C# Visual Studio中的代码按时覆盖率

C# Visual Studio中的代码按时覆盖率,c#,visual-studio,unit-testing,datetime,C#,Visual Studio,Unit Testing,Datetime,我正在Visual Studio 2013中编写单元测试,在代码覆盖率分析方面遇到了问题。语言为C#,使用默认的Microsoft.VisualStudio.TestTools.UnitTesting if (exsistingNode.NodeState > NodeState.Edit) { if (existingNode.NodeName != updatedNode.NodeName) { throw m_Diagnostics.ThrowCann

我正在Visual Studio 2013中编写单元测试,在代码覆盖率分析方面遇到了问题。语言为C#,使用默认的Microsoft.VisualStudio.TestTools.UnitTesting

if (exsistingNode.NodeState > NodeState.Edit)
{
    if (existingNode.NodeName != updatedNode.NodeName)
    {
        throw m_Diagnostics.ThrowCannotUpdateAfterEditState(subject, existingNode.NodeId, "NodeName");
    }
    if (existingNode.StartDate != updatedNode.StartDate)
    {
        throw m_Diagnostics.ThrowCannotUpdateAfterEditState(subject, existingNode.NodeId, "StartDate");
    }
    if (existingNode.Description != updatedNode.Description)
    {
        throw m_Diagnostics.ThrowCannotUpdateAfterEditState(subject, existingNode.NodeId, "Description");
    }
}
我已经对每个if语句进行了单元测试。我的第一个单元测试是成功的,它通过了所有这些测试,没有抛出错误,然后我有三个单独的单元测试,测试每个if语句并抛出一个错误。我的问题是代码分析显示了以下语句:

if (existingNode.StartDate != updatedNode.StartDate)
因为只是部分测试,我无法理解为什么。这是因为它涉及时间吗

在以下代码中也是如此,其中抛出被代码覆盖,但所有if语句都被代码部分覆盖

if (updatedNode.StartDate != existingNode.StartDate)
{
    if (updatedNode.StartDate.HasValue && updatedNode.StartDate < DateTime.Now)
    {
        throw m_Diagnostics.ThrowUpdateNodeException(subject, existingNode.NodeId, new InvalidOperationException("Cannot set the start date less than now."));
    }

    if (updatedNode.StartDate.HasValue && updatedNode.EndDate.HasValue && updatedNode.EndDate < updatedNode.StartDate)
    {
        throw m_Diagnostics.ThrowUpdateNodeException(subject, existingNode.NodeId, new InvalidOperationException("Cannot set the end date less than the start date."));
    }
}

if (updatedNode.EndDate != existingNode.EndDate)
{
    if (updatedNode.EndDate.HasValue && updatedNode.EndDate < DateTime.Now)
    {
        throw m_Diagnostics.ThrowUpdateNodeException(subject,  existingNode.NodeId, new InvalidOperationException("Cannot set the end date lessthan now."));
    }
if(updatedNode.StartDate!=existingNode.StartDate)
{
if(updatedNode.StartDate.HasValue&&updatedNode.StartDate
有人问了一些单元测试的例子。下面是两个与第一个案例有关的例子。如果你在其他案例中需要它们,请告诉我

[TestMethod] // Start Date Test that is only Partially covered
[ExpectedException(typeof(Exception))]
public void ChangeStartDate() // Unit Test where the Start Date is changed when not in Edit Mode
{
    //Arrange
    Node nodeToUpdate = new Node
    {
        NodeName = "nodeName",
        StartDate = DateTime.Now.AddDays(1),
        NodeState = NodeState.Open
    };
    collectionNode.Add(nodeToUpdate);

    Node updatedNode = new Node
    {
        NodeName = "nodeName",
        StartDate = DateTime.Now.AddDays(2),
        NodeState = NodeState.Open
    };

    INodeStore stubNodeStore = new CENSORED.StubINodeStore
    {
        GetNodeString = (NodeId) =>
        {
            return nodeToUpdate;
        }
    };
    server.NodeStoreStubs = stubNodeStore;

    INodePrivilegeStore stubNodePrivilegeStore = new CENSORED.StubINodePrivilegeStore
    {
        GetPrivilegeStringString = (NodeId, subject) =>
        {
            return new NodePrivilege
            {
                Permissions = NodePermissions.Administrator
            };
        }
    };
    server.NodePrivilegeStoreStubs = stubNodePrivilegeStore;

    m_NodeManager = ThrowHelper.GetServiceOrThrow<INodeManager>(server);
    //Act
    m_NodeManager.UpdateNode(updatedNode);
    //Assert
}

[TestMethod] // Unit Test that is fully covered
[ExpectedException(typeof(Exception))]
public void ChangeStartDate() // Unit Test where the Start Date is changed when not in Edit Mode
{
    //Arrange
    Node nodeToUpdate = new Node
    {
        NodeName = "nodeName",
        StartDate = DateTime.Now.AddDays(1),
        Description = "description,
        NodeState = NodeState.Open
    };
    collectionNode.Add(nodeToUpdate);

    Node updatedNode = new Node
    {
        NodeName = "nodeName",
        StartDate = DateTime.Now.AddDays(1),
        Description = "updatedDescription"
        NodeState = NodeState.Open
    };

    INodeStore stubNodeStore = new CENSORED.StubINodeStore
    {
        GetNodeString = (NodeId) =>
        {
            return nodeToUpdate;
        }
    };
    server.NodeStoreStubs = stubNodeStore;

    INodePrivilegeStore stubNodePrivilegeStore = new CENSORED.StubINodePrivilegeStore
    {
        GetPrivilegeStringString = (NodeId, subject) =>
        {
            return new NodePrivilege
            {
                Permissions = NodePermissions.Administrator
            };
        }
    };
    server.NodePrivilegeStoreStubs = stubNodePrivilegeStore;

    m_NodeManager = ThrowHelper.GetServiceOrThrow<INodeManager>(server);
    //Act
    m_NodeManager.UpdateNode(updatedNode);
    //Assert
}
[TestMethod]//仅部分涵盖的开始日期测试
[ExpectedException(typeof(Exception))]
public void ChangeStartDate()//不在编辑模式下更改开始日期的单元测试
{
//安排
Node nodeToUpdate=新节点
{
NodeName=“NodeName”,
StartDate=DateTime.Now.AddDays(1),
NodeState=NodeState.Open
};
collectionNode.Add(nodeToUpdate);
Node updatedNode=新节点
{
NodeName=“NodeName”,
StartDate=DateTime.Now.AddDays(2),
NodeState=NodeState.Open
};
INodeStore stubNodeStore=新审查的。StubINodeStore
{
GetNodeString=(NodeId)=>
{
返回nodeToUpdate;
}
};
server.NodeStoreStubs=stubNodeStore;
INodePrivilegeStore stubNodePrivilegeStore=新审查。StubINodePrivilegeStore
{
GetPrivilegeStringString=(节点ID,主题)=>
{
返回新节点权限
{
权限=NodePermissions.Administrator
};
}
};
server.nodeprivilegestorestrubs=stubNodePrivilegeStore;
m_NodeManager=ThrowHelper.GetServiceOrThrow(服务器);
//表演
m_NodeManager.UpdateNode(updatedNode);
//断言
}
[TestMethod]//完全覆盖的单元测试
[ExpectedException(typeof(Exception))]
public void ChangeStartDate()//不在编辑模式下更改开始日期的单元测试
{
//安排
Node nodeToUpdate=新节点
{
NodeName=“NodeName”,
StartDate=DateTime.Now.AddDays(1),
Description=“Description,
NodeState=NodeState.Open
};
collectionNode.Add(nodeToUpdate);
Node updatedNode=新节点
{
NodeName=“NodeName”,
StartDate=DateTime.Now.AddDays(1),
Description=“updatedescription”
NodeState=NodeState.Open
};
INodeStore stubNodeStore=新审查的。StubINodeStore
{
GetNodeString=(NodeId)=>
{
返回nodeToUpdate;
}
};
server.NodeStoreStubs=stubNodeStore;
INodePrivilegeStore stubNodePrivilegeStore=新审查。StubINodePrivilegeStore
{
GetPrivilegeStringString=(节点ID,主题)=>
{
返回新节点权限
{
权限=NodePermissions.Administrator
};
}
};
server.nodeprivilegestorestrubs=stubNodePrivilegeStore;
m_NodeManager=ThrowHelper.GetServiceOrThrow(服务器);
//表演
m_NodeManager.UpdateNode(updatedNode);
//断言
}

在进行“如果”测试时,您应该考虑所有组合的所有可能情况。 如果您不确定If的哪个部分没有正确测试,请尝试将它们分开,查看哪个“If”语句没有针对这两个值进行测试

public bool IsTimeBeforeNow(Nullable<DateTime> time)
{
    if (time.HasValue && time.Value < DateTime.Now)
        return true;
    return false;
}

[TestMethod]
public void TestIsTimeBeforeNow()
{
    //test time.HasValue with null
    Assert.AreEqual(false, this.IsTimeBeforeNow(null));
    //test time.HasValue with true
    //and test time.Value > DateTime.Now            
    Assert.AreEqual(false, this.IsTimeBeforeNow(DateTime.Now.AddDays(1)));
    //test time.HasValue with true
    //and test time.Value < DateTime.Now
    Assert.AreEqual(true, this.IsTimeBeforeNow(DateTime.Now.AddDays(-1)));
}
public bool istimeforenow(可空时间)
{
if(time.HasValue&&time.Value日期时间。现在
Assert.AreEqual(false,this.IsTimeBeforeNow(DateTime.Now.AddDays(1));
//test time.HasValue为true
//和测试时间。值<日期时间。现在
arenequal(true,this.IsTimeBeforeNow(DateTime.Now.AddDays(-1));
}

关键是测试每个逻辑路径

当您有一个“if”语句时,您必须测试if==true和if==false场景,以获得完整的代码覆盖率


当你有一个“开关”"声明,您必须测试所有可能的情况,包括默认情况。

我们可以查看您的测试吗?我添加了两个与第一个情况有关的测试。如果需要,我可以添加其他的。请告诉我:)谢谢您。我没有意识到时间可以为空。只要我检查了starttime为空和endtime为空的另一个测试,它就会工作d、 在C#中,当使用HasValue和Value时,这意味着大部分时间使用的是可为null的。Nullabe是一种泛型类型,它有两个属性:public bool HasValue{get;}