gpt4 book ai didi

c# - Moq 是单元测试的代理

转载 作者:行者123 更新时间:2023-12-02 15:04:37 25 4
gpt4 key购买 nike

我刚开始使用 Moq,但找不到执行此操作的方法。我有一个generateId私有(private)方法,称为

/// <summary>
/// Generates a call Id for external interfaces
/// </summary>
/// <returns></returns>
private string GenerateCallId()
{
return "EX" + SharedServicesClientProxy.Instance.GenerateId().ToString();
}

我想对这个方法进行单元测试,因此我需要模拟代理。SharedServicesClientProxy 只是一个实现 ISharedServices 接口(interface)但添加单例的对象。我想测试所有字符串是否正确返回以“EX”开头的字符串。这是我的单元测试,使用 Moq

    /// <summary>
/// A test for GenerateCallId
/// A CallId for external systems should always start by "EX"
///</summary>
[TestMethod()]
[DeploymentItem("myDll.dll")]
public void GenerateCallIdTest()
{
myService_Accessor target = new myService_Accessor();
var SharedServicesClientProxy = new Mock<ISharedServices>();
SharedServicesClientProxy.Setup(x => x.GenerateId()).Returns(5396760556432785286);
string actual;
string extCallIdPrefix = "EX";
actual = target.GenerateCallId();
Assert.IsTrue(actual.StartsWith(extCallIdPrefix));
}

我想我在错误的地方进行了模拟?

以更一般的方式,我如何模拟将由我正在测试的方法调用的对象?例如:

        /// <summary>
/// dummy test
///</summary>
[TestMethod()]
[DeploymentItem("myDll.dll")]
public void Foo()
{
myService_Accessor target = new myService_Accessor();
boolexpected = false;
actual = target.Foo();
Assert.IsTrue(actual,expected);
}

/// <summary>
/// Foo
/// </summary>
/// <returns></returns>
private bool Foo()
{
return this.Bar();
}

我需要最小起订量酒吧,但我需要在哪里做呢?谢谢,塞布

最佳答案

在继续之前搜索术语“依赖注入(inject)”。

您依赖于 SharedServicesClientProxy.Instance,它是一个单例。这将导致测试隔离问题,因为您将在测试中重复使用同一实例,并且容易出现状态遗留问题。

我建议像这样注入(inject)依赖项(并且OT-您不应该测试私有(private)方法...通过公共(public)接口(interface)进行测试。它不在我的系统中..:)

public class AnonClass
{
ISharedServices _sharedServices;
AnonClass(ISharedServices sharedServicesObj)
{
_sharedServices = sharedServicesObj;
}
public string GenerateCallId()
{
return "EX" + _sharedServices.GenerateId().ToString();
}
}

重新连接当前代码以创建这样的目标类

var class = new AnonClass(SharedServicesClientProxy.Instance);

在您的测试中,传入模拟对象而不是单例返回的对象

关于c# - Moq 是单元测试的代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1623598/

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