【问题标题】:Error CS0118 'TestBuilder' is a namespace but is used like a type错误 CS0118 'TestBuilder' 是命名空间,但用作类型
【发布时间】:2020-07-21 06:26:38
【问题描述】:

我正在进行单元测试。我创建 TestBuilder 类,在其中创建方法 SetupTown 方法。 当我尝试在我的主测试类中调用此方法时 - 我有错误(错误 CS0118'TestBuilder' 是一个命名空间,但用作类型)。我读过它并建议用方法调用一个类。我试过了,但是没有用。

公共部分类 TownServiceTests

 public partial class TownServiceTests
    {
        private class TestBuilder
        {
            public Mock<ITownRepository> MockTownRepository { get; set; }

            //public Mock<IClientViewModelBuilder> MockClientPropertyModelBuilder { get; set; }

            public Mock<IMapper> MockMapper { get; set; }

            public TestDataGenerator TestDataGenerator;

            private readonly string _jsonDataPath = @"../../../TestData/Town/TownTestData.json";

            private string _jsonDataKey;

            private TownViewModel Towns { get; set; }

            public TestBuilder(string jsonDataKey)
            {
                MockTownRepository = new Mock<ITownRepository>();

                //MockClientPropertyModelBuilder = new Mock<IClientViewModelBuilder>();

                MockMapper = new Mock<IMapper>();

                TestDataGenerator = new TestDataGenerator(_jsonDataPath);

                _jsonDataKey = jsonDataKey;

                TestDataGenerator.LoadData(_jsonDataKey);
            }

            public ITownService Build()
            {
                return new TownService(MockTownRepository.Object,
                                        MockMapper.Object);
            }

            public TestBuilder SetupTowns()
            {
                var towns = TestDataGenerator.GetTestData<Town>(_jsonDataKey, "Towns");

                MockTownRepository.Setup(r => r.InsertTown(It.IsAny<string>()))    
                                    .ReturnsAsync(towns.FirstOrDefault().Id);               

                return this;
            }
        }
    }
}

请检查方法public TestBuilder SetupTowns

这是我的TestClass

    [TestClass]
    public partial class TownServiceTests
    {
        [TestMethod]
        public async Task ValidInsertTown()
        {
            var builder = new TestBuilder("Data").SetupTowns; //Problem

            var service = builder.Build();

            var expectedTowns = builder.TestDataGenerator.GetTestData<Town>("Data", "Towns");

            var result = await service.InsertTown(expectedTowns);

            Assert.IsNotNull(result);
            Assert.IsNull(result);
        }
    }

玩具能告诉我我做错了什么吗?

示例

 public partial class ClientServiceTests
    {
        private class TestBuilder
        {
            public Mock<IClientRepository> MockClientRepository { get; set; }

            public Mock<IClientViewModelBuilder> MockClientPropertyModelBuilder { get; set; }

            public Mock<IMapper> MockMapper { get; set; }

            public TestDataGenerator TestDataGenerator;

            private readonly string _jsonDataPath = @"../../../TestData/Client/ClientTestData.json";

            private string _jsonDataKey;

            public TestBuilder(string jsonDataKey)
            {
                MockClientRepository = new Mock<IClientRepository>();

                MockClientPropertyModelBuilder = new Mock<IClientViewModelBuilder>();

                MockMapper = new Mock<IMapper>();

                TestDataGenerator = new TestDataGenerator(_jsonDataPath);

                _jsonDataKey = jsonDataKey;

                TestDataGenerator.LoadData(_jsonDataKey);
            }

            public IClientService Build()
            {
                return new ClientService(MockClientRepository.Object
                                       , MockClientPropertyModelBuilder.Object
                                       , MockMapper.Object);
            }

            public TestBuilder SetupClients()
            {
                var clients = TestDataGenerator.GetTestData<ClientSummary>(_jsonDataKey, "Clients");

                MockClientRepository.Setup(r => r.GetClientBySearchCriteria(It.IsAny<string>()))
                                    .ReturnsAsync(clients);

                var clientViewModels = TestDataGenerator.GetTestData<ClientViewModel>(_jsonDataKey, "ClientViewModel");

                MockClientPropertyModelBuilder.Setup(r => r.GetClientViewModel(clients))
                                              .Returns(clientViewModels);

                return this;
            }

            public TestBuilder SetupInvalidInputClients()
            {
                MockClientRepository.Setup(r => r.GetClientBySearchCriteria(It.IsAny<string>()))
                                    .ReturnsAsync(new List<ClientSummary>());

                MockClientPropertyModelBuilder.Setup(r => r.GetClientViewModel(new List<ClientSummary>()))
                                              .Returns(new List<ClientViewModel>());

                return this;
            }
        }
    }

TestClass(这里很好用)

 [TestMethod]
        public async Task GetClientBySearchCriteria_ValidInput_ReturnClients()
        {
            var searchParameter = "1";

            var builder = new TestBuilder("Data").SetupClients();

            var service = builder.Build();

            var expectedClients = builder.TestDataGenerator.GetTestData<ClientSummary>("Data", "Clients");

            var result = await service.GetClientBySearchCriteria(searchParameter);

            Assert.IsNotNull(result);
            Assert.AreEqual(2, result.Count);
            Assert.AreEqual(expectedClients.FirstOrDefault().Name, result.FirstOrDefault().Name);
        }

文件的命名空间

【问题讨论】:

  • var builder = new TownServiceTests.TestBuilder("Data").SetupTowns;
  • 它不起作用“错误CS0426类型名称'TestBuilder'不存在于类型'TownServiceTests'中”
  • 编译器不会撒谎。您是否也有可能在某处使用TestBuilder 作为命名空间名称?如果是这样,似乎名称查找是在您希望它找到的课程之前发现的。两个文件之间的命名空间声明似乎也可能不同,这意味着您作为单个类的两个部分呈现的内容实际上不是,因为它们位于不同的命名空间中。不幸的是,您没有向我们展示文件的名称空间。
  • 我添加了我的文件命名空间屏幕
  • 这有效地向我们展示了文件系统布局。它没有告诉我们有关单个文件顶部的namespace X.Y.Z 行。

标签: c# sql unit-testing testing


【解决方案1】:

我认为,问题的发生是因为您有 Something.TestBuilder.Something 命名空间,而编译器试图使用它而不是类。

您有 TestBuilder 文件夹和其中的一些类。可能是 TestBuilder 文件夹中的类在其命名空间中包含 TestBuilder,编译器试图访问此命名空间而不是类。

【讨论】:

  • 你确定吗?我添加了 example,在相同的情况下效果很好
  • 我现在才注意到它,但是您是否尝试在没有括号的情况下调用 SetupTowns 方法? new TestBuilder("Data").SetupTowns 而不是 new TestBuilder("Data").SetupTowns()
  • 是的,谢谢,我修好了。但情况没有改变
  • 我无法重现此错误,因此我认为问题出在其他地方,例如您创建了名为 TestBuilder 的命名空间
  • TownServiceTests.TestBuilder.cs 文件位于 TestBuilder 文件夹内。此文件夹中的部分类 TownServiceTests 可能具有不同的命名空间,因此它被解释为不同的类。
猜你喜欢
  • 2022-12-11
  • 1970-01-01
  • 1970-01-01
  • 2021-12-09
  • 2011-05-13
  • 2013-02-07
  • 2015-07-22
相关资源
最近更新 更多