模拟一个具体的基类

问题描述 投票:0回答:0

我在我的 web api 中使用第 3 方 API Cloudinary。 Cloudinary 类(这是您用来访问所需 API 的类)是一个具体类,它不从任何接口或其他类继承。我正在尝试模拟

Upload
方法,这是 Cloudinary 类的一种方法:

 //
    // Summary:
    //     Uploads an image file to Cloudinary.
    //
    // Parameters:
    //   parameters:
    //     Parameters of image uploading .
    //
    // Returns:
    //     Results of image uploading.
    public ImageUploadResult Upload(ImageUploadParams parameters)
    {
        return Upload<ImageUploadResult, ImageUploadParams>(parameters);
    }

由于该方法不是虚方法,我无法使用 Moq

Setup()
方法来覆盖该方法的现有行为。由于缺少可模拟的接口,我认为 Moq 框架不会帮到我吗?

这是我创建的与 Cloudinary API 交互的服务:

public class PhotoService : IPhotoService
    {
        protected readonly Cloudinary cloudinary;

        public PhotoService(IOptions<CloudinaryConfigOptions> config)
        {
            this.cloudinary = CloudinaryConfigSetup.SetupCloudinary(config);
        }

        public ImageUploadResult UploadImage(IFormFile image)
        {
            var stream = image.OpenReadStream();

            var imageUploadParams = new ImageUploadParams()
            {
                File = new FileDescription(image.FileName, stream),
                UseFilename = true,
                UniqueFilename = false,
                Overwrite = true
            };

            var response = cloudinary.Upload(imageUploadParams);
            return response;
        }
    }

作为解决方法,我将 cloudinary 字段的访问修饰符更改为

protected
并派生了一个新类,以便对我的服务进行单元测试。这是测试和派生类:

public class PhotoServiceUnitTests
{
    [Fact]
    public void UploadImage_returns_an_ImageUploadResult_containing_a_200_response_when_upload_Successful()
    {
        var mockCloudinaryConfig = MockCloudinaryHelper.CreateMockCloudinaryConfig();
        var service = new PhotoServiceTestClass(mockCloudinaryConfig.Object);
        var bytes = Encoding.UTF8.GetBytes("This is a dummy file");
        IFormFile mockImage = new FormFile(new MemoryStream(bytes), 0, bytes.Length, "Test", "TestImage");
        var result = service.UploadImage(mockImage);

        Assert.Equal(200, (int)result.StatusCode);
    }
}

public class PhotoServiceTestClass : PhotoService
{
    private new MockCloudinary cloudinary { get; set; }

    public PhotoServiceTestClass(IOptions<CloudinaryConfigOptions> config) : base(config)
    {
        cloudinary = new MockCloudinary();
    }
}

这是我创建的模拟 cloudinary 类:

   public class MockCloudinary
    {
        public virtual ImageUploadResult Upload(ImageUploadParams imageUploadParams)
        {
            var imageUploadResult = new ImageUploadResult()
            {
                StatusCode = HttpStatusCode.OK
            };
            return imageUploadResult;
        }
    }

我在上述测试中遇到的问题是,我创建的派生服务似乎仍在使用以前的 cloudinary

Upload()
方法实现,因为它试图联系第 3 方 API 而不是简单地返回
imageUploadResult 
上面
MockCloudinary
类中定义的对象。

有谁知道为什么会这样,或者有更好的方法来嘲笑这个第 3 方具体课程吗?

.net unit-testing moq xunit cloudinary
© www.soinside.com 2019 - 2024. All rights reserved.