C# 单元测试对象到对象映射

C# 单元测试对象到对象映射,c#,unit-testing,C#,Unit Testing,我被要求协助编写一些对象到对象映射的MS单元测试代码。有人能建议什么级别的测试适合测试映射功能吗 下面显示的是一些(非生产)示例代码 public class Foo { public enum FooType { Active, Deleted, Open, Closed } public bool IsConditionMet { get; set; } public FooType SimpleType { get; set; }

我被要求协助编写一些对象到对象映射的MS单元测试代码。有人能建议什么级别的测试适合测试映射功能吗

下面显示的是一些(非生产)示例代码

public class Foo
{
    public enum FooType
    {
        Active, Deleted, Open, Closed
    }

    public bool IsConditionMet { get; set; }
    public FooType SimpleType { get; set; }
}

public class Bar
{
    public string SomeCondition { get; set; }
    public string SomeAbbreviatedType { get; set; }
}

public static class BarMapper
{
    // sample to mapping code 
    public static Foo Map(Bar bar)
    {
        var foo = new Foo
                      {
                          IsConditionMet = bar.SomeCondition.Equals("y", StringComparison.OrdinalIgnoreCase)
                      };

        // this is sample code and not used in production
        switch (bar.SomeAbbreviatedType)
        {
            case "A":
                foo.SimpleType = Foo.FooType.Active;
                break;

            case "D":
                foo.SimpleType = Foo.FooType.Deleted;
                break;

            case "O":
                foo.SimpleType = Foo.FooType.Open;
                break;

            case "C":
                foo.SimpleType = Foo.FooType.Closed;
                break;
        }

        return foo;
    }
}
我不是在寻找单元测试的定义、如何编写单元测试或对TDD的解释,而是在寻找一个例子,说明在上面的例子中您将编写什么样的单元测试

注意:不幸的是,由于源数据的性质,使用类似的映射框架不会为项目增加任何价值

更新:这是我关于适当测试级别的示例。

[TestMethod]
public void IsMappingToIsConditionMetCorrect()
{
    var fooIsConditionMetShouldBeTrue = BarMapper.Map(new Bar { SomeCondition = "Y" });
    var fooIsConditionMetShouldBeFalse = BarMapper.Map(new Bar { SomeCondition = "N" });
    var fooIsConditionMetShouldBeFalse_BecauseSomeConditionIsInvalid = BarMapper.Map(new Bar { SomeCondition = "SOMETHING" });

    Assert.IsTrue(fooIsConditionMetShouldBeTrue);
    Assert.IsFalse(fooIsConditionMetShouldBeFalse);
    Assert.IsFalse(fooIsConditionMetShouldBeFalse_BecauseSomeConditionIsInvalid);
}

[TestMethod]
public void TestsCanBuild()
{
    var fooAbbreviatedTypeShouldBeA = BarMapper.Map(new Bar { SomeAbbreviatedType = "A" });
    var fooAbbreviatedTypeShouldBeD = BarMapper.Map(new Bar { SomeAbbreviatedType = "D" });
    var fooAbbreviatedTypeShouldBeO = BarMapper.Map(new Bar { SomeAbbreviatedType = "O" });
    var fooAbbreviatedTypeShouldBeC = BarMapper.Map(new Bar { SomeAbbreviatedType = "C" });

    Assert.AreSame(Foo.FooType.Active, fooAbbreviatedTypeShouldBeA);
    Assert.AreSame(Foo.FooType.Deleted, fooAbbreviatedTypeShouldBeD);
    Assert.AreSame(Foo.FooType.Open, fooAbbreviatedTypeShouldBeO);
    Assert.AreSame(Foo.FooType.Closed, fooAbbreviatedTypeShouldBeC);

    // TODO: test for an incorrect "SomeAbbreviatedType" property value
}

您的测试看起来相当合理(当您实现TODO:test以获取不正确的“some缩写类型”属性值时),您可以测试的就不多了。我个人会更深入地研究一点错误处理,例如,Bar中的某些缩写类型为空是否有效?也许应该是一个枚举,等等。?但从测试的角度来看,这没关系。

您需要的是测试覆盖率数据,它测量测试代码与总代码的比率。虽然你的测试可能会提供一个很高的比率,但除了猜测之外,你没有办法知道这一点。您可以从测试覆盖率工具获得准确的数据


多种语言的测试覆盖工具(包括java、C++、C++、C和COBOL),可以在

找到。谢谢确认我的方法