K.Z
K.Z

Reputation: 5075

Perform xUnit Moq test for Web API Insert Record method

I have an application with .NET CORE 2.2. Web API and created a xUnit test using moq and fixture.

My controller Method takes SupplierDtoObject followed by it calls the service method where creates supplier record and it returns Guid Id of newly created records. Then the controller method calls GetSupplier in service class by passing the Id to get Supplier object. (new record)

Since my controller method returns Supplier Object and Id is generated at the service class level so not sure how to moq this behaviour?

Controller method (SUT)

[HttpPost]
    public async Task<ActionResult<Supplier>> PostSupplier(SupplierDto supplier)
    {
        var newlyCreatedSupplierId = await _supplierService.InsertSupplier(supplier);

        if (newlyCreatedSupplierId != Guid.Empty)
        {
            var newlyCreatedSupplier = await _supplierService.GetSupplier(newlyCreatedSupplierId);
            return newlyCreatedSupplier;
        }
        return null;
    }

Test class

    [Fact]
    public async Task PostSupplier_WithValidSupplierData_Should_CreateSupplierInstance()
    {
        //Arrange
        var fixture = new Fixture();
        var supplierDtoMockData = fixture.Create<SupplierDto>();
        var supplierMoqData = GetSupplerDataModelObject(supplierDtoMockData);
        mockSupplierService.Setup(m => m.InsertSupplier(supplierDtoMockData)).ReturnsAsync(supplierMoqData.Id);
         //How to moq Supplier based on based on supplierMoqData.Id???
        

        //Act
        var actualResultData = sut.PostSupplier(supplierDtoMockData);??

        //Assert
       ??
    }

Upvotes: 0

Views: 389

Answers (1)

K.Z
K.Z

Reputation: 5075

I have managed to sort it out ...

    [Fact]
    public async Task PostSupplier_WithSupplierData_Should_CreateSupplierInstance()
    {
        //Arrange
        var fixture = new Fixture();
        var supplierDtoMockData = fixture.Create<SupplierDto>();
        var supplierMockData = GetSupplerDataModelObject(supplierDtoMockData);
        mockSupplierService.Setup(m => m.InsertSupplier(supplierDtoMockData)).ReturnsAsync(supplierMockData.Id);
        mockSupplierService.Setup(m => m.GetSupplier(supplierMockData.Id)).ReturnsAsync(supplierMockData);

        //Act
        var actualDataResult = await sut.PostSupplier(supplierDtoMockData);

        //Assert
        Assert.Equal(supplierMockData, actualDataResult.Value);
    }

Upvotes: 1

Related Questions