gpt4 book ai didi

c# - 如何避免为实现相同接口(interface)的类编写重复的单元测试?

转载 作者:太空狗 更新时间:2023-10-29 20:25:43 32 4
gpt4 key购买 nike

我刚刚开始使用 Visual Studio 2010 进行单元测试。我想知道是否有一个工作流允许我创建一系列应用于接口(interface)的测试,然后将这些接口(interface)测试应用于任何和所有实现接口(interface)的类。

例如假设我有以下界面。

public interface IAnimal
{
public string Name {get;}
public string Speak();
}

显然,我可以有许多实现此接口(interface)的类。

public class Dog:IAnimal
{
public string Name {get{return "Dog";}}
public string Speak{return "BARK BARK";}
public bool LickBalls();
}

public class Cat:IAnimal
{
public string Name {get{return "Cat";}}
public string Speak{return "MEOW MEOW";}
public bool Scratch();
}

所以我想定义一系列适用于所有 IAnimals

的测试
   public TestAnimalName(IAnimal animal)
{
Assert.IsFalse(string.IsNullorEmpty(animal.Name));
}

public TestAnimalSpeak(IAnimal animal)
{
string sound = animal.Speak();
Assert.IsFalse(string.IsNullOrEmpty(sound));
}

然后我想定义一个主要的 TestAnimal() 方法,它可以用来测试任何 IAnimal

TestAnimal(IAnimal animal)
{
TestAnimalName(animal);
TestAnimalSpeak(animal);
}

然后我可以在测试具体类型的 IAnimal 时调用此 TestAnimal() 方法。

[TestMethod]
TestCat()
{
Cat c = new Cat();
TestAnimal(c);
}

[TestMethod]
TestDog()
{
Dog c = new Dog();
TestAnimal(c);
}

然而,当我尝试在 Visual Studio 中执行此操作时,被调用方法中的 Asserts 会被忽略。我试图用下面的方法简化问题,发现它通过了,即使它调用了一个应该导致失败的方法。

[TestMethod]
public void AssertInCalledMethod() //this will pass
{
Assert.IsTrue(true);
Blah();
}

public void Blah()
{
Assert.IsTrue(false);
}

那么我怎样才能避免为所有实现相同接口(interface)的类编写大量重复测试呢?

最佳答案

格雷格·杨的 Hei Hei Grensesnitt对这个问题采取了稍微不同的方法,我喜欢。您可以编写接口(interface)规范:

[InterfaceSpecification] 
public class ICanAddTests : AppliesTo<ICanAdd>{

[Test]
public void can_add_two_numbers() {
Assert.AreEqual(5, sut.Add(2,3));
}
}

... 并且框架会自动对它发现的所有实现该接口(interface)的类执行测试。这是使用 NUnit,而不是 MSTest,但我认为这是一个相当聪明的想法,并且使工作流程非常简单。

关于c# - 如何避免为实现相同接口(interface)的类编写重复的单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4149796/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com