用 C# 编写 Xunit 测试用例

问题描述

我正在学习编写单元测试用例,我正在使用 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 ...
}

}

解决方法

请注意,使用 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(....);
    }
}