【问题标题】:Specific questions about unit-testing Service Fabric Applications using Mocks关于使用 Mocks 对 Service Fabric 应用程序进行单元测试的具体问题
【发布时间】:2021-03-27 18:12:06
【问题描述】:

此问题是对以下问题的跟进:Writing UnitTests for a Service Fabric Application Class

我的应用程序定义属于这种类型 - 对其进行了简化以解决我面临的最基本问题:

namespace SearchService
{
    internal sealed class SearchServiceClass : StatelessService
    {
        //variables defined followed by constructor
        private string jsonStr;
        public SearchServiceClass(StatelessServiceContext context)
            : base(context)
        {
            try
            {
                var dataPackage = Context.CodePackageActivationContext
                .GetDataPackageObject("Data");
                jsonStr = File.ReadAllText(dataPackage.Path + @"\data.json");
            }
            catch
            {
                //exception handling code
                throw;
            }
        }
        
        public bool IsDataJsonLoaded
        {
            get
            {
                return !(jsonStr == null);
            }
        }
    }
}

测试类看起来像:

namespace SearchService.Tests
{
    [TestClass]
    public class SearchServiceClassTest
    {
        [TestMethod]
        public void SearchServiceClassConstructor()
        {
           var searchServiceClass = new SearchServiceClass(MockStatelessServiceContextFactory.Default);
           Assert.IsTrue(searchServiceClass.IsDataJsonLoaded);
        }
    }
}

我得到的例外是 "System.NullReferenceException: Object reference not set to an instance of an object." 这是由于“dataPackage.Path”未设置为“var dataPackage = Context.CodePackageActivationContext.GetDataPackageObject("Data");”中的有效值行。

如何使用模拟复制 CodePackageActivationContext?这里的“Data”指的是DataPackage,它是一个名为“Data”的文件夹,与SearchServiceClass的代码一起驻留。

【问题讨论】:

  • @LoekD:你能帮我解决这个问题吗?
  • 您必须模拟 StatelessServiceContext 并将该模拟传递给 SearchServiceClass
  • @AlexanderPetrov - 已编辑。对不起,那是一个错字。我之前已经解决了。

标签: c# .net unit-testing moq azure-service-fabric


【解决方案1】:

您可以使用以下代码来模拟该行:

var codePackageActivationContext = new Mock<ICodePackageActivationContext>();

欲了解更多信息,请查看:How to use Moq framework to unit test azure service fabrics?

以下查询:

还有一些我不完全理解的东西,是变量和 在类中创建成员,但在构造函数之前 叫。例如"私有字符串 jsonStr;"线似乎得到 在单元测试中毫不费力地执行,即使我只是在打电话 单元测试中的构造函数和“私有字符串 jsonStr;”是 在构造函数之外。所以同样适用于所有变量 在构造函数之外创建?

这里是一个简单的 C# 代码:在private string jsonStr; 行中,定义了 jsonStr。但是,在引用它之前,你应该初始化它,否则它会抛出空引用错误 - 你正在你的构造函数中做。

【讨论】:

  • 我正在使用 ServiceFabric.Mocks Nuget 包。您能否告诉我如何使用 ServiceFabric.Mocks Nuget 包而不是 Moq 框架来模拟 CodePackageActivationContext?
  • 如果只想使用Servicefabric.Mocks,可以使用MockCodePackageActivationContext:github.com/loekd/ServiceFabric.Mocks
猜你喜欢
  • 2016-06-02
  • 2021-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-14
  • 2019-10-25
  • 1970-01-01
  • 2012-03-21
相关资源
最近更新 更多