gpt4 book ai didi

c# - 如何伪造 C# 单元测试中内置方法的返回?

转载 作者:行者123 更新时间:2023-11-28 21:03:28 24 4
gpt4 key购买 nike

我有一个公共(public)静态方法,它使用 Random 类的对象来生成一个整数。然后将该整数作为列表的索引。我想在控制随机对象的 Next 方法返回的内容的同时测试该方法的逻辑。

public class RandomGenerator
{

// a static method which produces a random selection from a List
public static string GetRandomListMember(List<string> anyStringList)
{
Random rand = new Random();
int randomInt = rand.Next(anyStringList.Count);
return anyStringList[randomInt];
}
}

来 self 的 MSTest 文件:

[TestClass]
public class RandomGeneratorSpec
{
[TestMethod]
public void GetRandomListMember_ListOfStrings()
{
List<string> strings = new List<string> { "red", "yellow", "green" };

Mock<Random> mockRandom = new Mock<Random>();
mockRandom.Setup(rand => rand.Next(strings.Count)).Returns(() => 2); // 2!

string result = RandomGenerator.GetRandomListMember(strings);

Assert.AreEqual("green", result);
}
}

我希望 mockRandom.Next 每次在此测试中运行时都返回 2。显然,这不是这样做的方法。我一直在搜索示例,但它们似乎都在对象上使用方法并使用实例方法而不是静态方法。

在对使用内置方法的方法进行单元测试时,如何控制内置方法返回的内容?

最佳答案

考虑重构以实现更易于维护的设计

public class RandomGenerator {
private readonly Random random;

public RandomGenerator(Random random = default(Random)) {
this.random = random ?? new Random();
}

public string GetRandomListMember(List<string> anyStringList) {
int randomInt = random.Next(anyStringList.Count);
return anyStringList[randomInt];
}
}

这允许更灵活地使用和测试主题类

[TestClass]
public class RandomGeneratorSpec {
[TestMethod]
public void GetRandomListMember_ListOfStrings() {
//Arrange
List<string> strings = new List<string> { "red", "yellow", "green" };
string expected = "green";
Mock<Random> mockRandom = new Mock<Random>();
mockRandom.Setup(rand => rand.Next(strings.Count)).Returns(() => 2); // 2!
var subject = new RandomGenerator(mockRandom.Object);

//Act
string actual = subject.GetRandomListMember(strings);

//Assert
Assert.AreEqual(expected, actual);
}
}

理想情况下,如果这个生成器要用作服务,它应该有自己的抽象

public interface IRandomGenerator {
string GetRandomListMember(List<string> anyStringList);
}

public class RandomGenerator : IRandomGenerator {
//...omitted for brevity
}

这样它就可以在需要的地方显式注入(inject),而不是静态地用作可以被认为是代码味道的紧密耦合的依赖项。

关于c# - 如何伪造 C# 单元测试中内置方法的返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58176256/

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