【问题标题】:Writing Xunit test cases in C#用 C# 编写 Xunit 测试用例
【发布时间】:2021-05-05 06:59:54
【问题描述】:

我正在学习编写单元测试用例,我正在使用 Xunit 框架。我有一个场景,我想编写一个测试用例来测试我的 cosmos db 模拟器中的不同场景。为此,我正在尝试创建一个数据库、容器并在我的 cosmos db 模拟器中插入少量测试数据,然后编写我的事实并在测试用例完成后将其删除……以下是我从互联网上找到的代码,想知道我做的是否正确......以及我可以从哪里开始编写我的测试用例。

    namespace Project.Tests
{
    public class DatabaseFixture : IDisposable
    {
        private static readonly string CosmosEndpoint = "https://localhost:8081";
        private static readonly string EmulatorKey = "C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==";
        private static readonly string DatabaseId = "Recordings";
        private static readonly string RecordingCollection = "testdata";

    public DatabaseFixture()
    {
        var client = new DocumentClient( new Uri( CosmosEndpoint ), EmulatorKey,
            new ConnectionPolicy
            {
                ConnectionMode = ConnectionMode.Direct,
                ConnectionProtocol = Protocol.Tcp

            } );
        var databaseCreationResult = client.CreateDatabaseAsync( new Database { Id = DatabaseId } ).Result;
        var collectionCreationResult = client.CreateDocumentCollectionAsync( UriFactory.CreateDatabaseUri( DatabaseId ),
            new DocumentCollection { Id = RecordingCollection } ).Result;
        var recData = new Recordings { Id = "Test" };

        
        var itemResult = client
            .CreateDocumentAsync(
                UriFactory.CreateDocumentCollectionUri( DatabaseId, RecordingCollection ), recData )
            .Result;            
        var document = client
            .ReadDocumentAsync(
                UriFactory.CreateDocumentUri( DatabaseId, RecordingCollection, itemResult.Resource.Id ) )
            .Result;            
        Recordings site = (dynamic)document.Resource;
    }

    public void Dispose()
    {
        // ... clean up test data from the database ...
        throw new NotImplementedException();
    }
}

public class Recordings
{
    public string Id { get; set; }
}

public class MyDatabaseTests : IClassFixture<DatabaseFixture>
{
    DatabaseFixture fixture;

    public MyDatabaseTests( DatabaseFixture fixture )
    {
        this.fixture = fixture;
    }

    // ... write tests, using fixture.Db to get access to the database server ...
}

}

【问题讨论】:

  • 不过,这并不完全是一个 unit 测试。 你想在这里测试什么? cosmos db模拟器是否有效?
  • 如果你只是想开始学习如何编写测试,从最简单的任务开始,你可以想出。数据库端到端/集成测试肯定不是。从一个没有依赖或副作用的简单函数开始。
  • 我正在尝试在我的 cosmos db 模拟器中插入数据,并有不同的测试场景,我想用插入的数据进行测试。
  • 所以在一行中我想编写单元测试用例,我在模拟器中初始化和创建我的数据库并插入数据,然后开始编写我的事实,然后一旦完成我就可以删除这个数据库。
  • 但是假设我的数据库和容器已经在 Cosmos 模拟器中创建,你能告诉我我可以从哪里开始调用 db 和 conatiner 并插入数据并开始编写我的事实

标签: c# azure-cosmosdb xunit.net


【解决方案1】:

请注意,使用 Web API 并不是单元测试理念的一部分。单元测试通常应该独立于外部交互。

您仍然可以使用 xUnit 执行测试,但您不在 UNIT 测试环境中。 如果您可以访问服务背后的代码,则可以在没有 Web 层的情况下对其进行单元测试。 (例如,您可以直接对 REST 控制器类进行单元测试。)

如果你忽略这一点,我认为你的问题中已经有了答案。

您可以直接在测试类中编写测试。

public class MyDatabaseTests : IClassFixture<DatabaseFixture>
{
    DatabaseFixture fixture;

    public MyDatabaseTests( DatabaseFixture fixture )
    {
        this.fixture = fixture;
    }

    // Write test method here
    [Fact]
    private void MyTestMethod()
    {
        // Prepare Test
        /// Prepare your test data here.

        // Execute Test
        /// Execute your test operation here.

        // Validate Test
        ///  Use Assert methods here.
        /// Assert.True(....);
    }
}

【讨论】:

  • 好的,所以我应该从在数据库中插入数据并编写我的测试用例开始。最初的想法是使用我的 devops 管道中的 powershell api 初始化和控制我的数据库(即启动 cosmos db 模拟器,创建数据库和容器),然后运行单元测试用例。我想这就是你想说的。如果我错了,请纠正我
  • 它在技术上是可行的。但我不建议在您的 CICD 中以这种方式测试数据库。
  • 你能帮我在上面的代码中我应该在哪里编写代码来调用我的数据库并插入数据,以及测试完成后如何删除数据
猜你喜欢
  • 2013-10-10
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多