我在我的 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 方具体课程吗?