因此,我正在尝试测试Azure表存储并模拟我所依赖的东西。我的类是以一种我在构造函数中建立连接的方式来构建的,即。我创建了一个CloudStorageAccount
的新示例,其中我创建了一个具有storageName
和storageKey
的StorageCredentials
示例。然后,我创建了一个CloudTable
示例,在代码中进一步使用它来执行CRUD操作。我的类看起来如下:
public class AzureTableStorageService : ITableStorage
{
private const string _records = "myTable";
private CloudStorageAccount _storageAccount;
private CloudTable _table;
public AzureTableStorageService()
{
_storageAccount = new CloudStorageAccount(new StorageCredentials(
ConfigurationManager.azureTableStorageName, ConfigurationManager.azureTableStorageKey), true);
_table = _storageAccount.CreateCloudTableClient().GetTableReference(_records);
_table.CreateIfNotExistsAsync();
}
//...
//Other methods here
}
字符串_table
在整个类中被重用以用于不同的目的。我的目标是模拟它,但由于它是虚拟的,并且没有实现任何接口,所以我无法提供简单的Mock
解决方案,如:
_storageAccount = new Mock<CloudStorageAccount>(new Mock<StorageCredentials>(("dummy", "dummy"), true));
_table = new Mock<CloudTable>(_storageAccount.Object.CreateCloudTableClient().GetTableReference(_records));
型
因此,当我尝试以这种方式构建我的单元测试时,我得到:Type to mock must be an interface or an abstract or non-sealed class.
个
我的目标是完成这样的事情:
_table.Setup(x => x.DoSomething()).ReturnsAsync("My desired result");
型
任何想法都高度赞赏!
5条答案
按热度按时间wqlqzqxt1#
我还在为绑定到Azure表存储的Azure函数实现单元测试时遇到了困难。我终于使用一个派生的CloudTable类使它工作起来了,在那里我可以覆盖我使用的方法并返回固定的结果。
字符串
我通过传递存储模拟器用于本地存储的配置字符串来示例化mock类(参见https://learn.microsoft.com/en-us/azure/storage/common/storage-configure-connection-string)。
型
在本例中,“screenSettings”是表的名称。
模拟类现在可以从单元测试传递给Azure函数。
也许这就是你要找的?
yhqotfr82#
为了补充答案,因为您的目标是使用mocking框架,只需设置一个从CloudTable继承并提供默认构造函数的对象,就可以让您Mock继承的对象本身并控制它返回的内容:
字符串
那么这只是一个创建模拟的案例。我使用NSubstitute,所以我这样做了:
型
但我猜Moq会允许
型
(My Moq有点生疏,所以我猜上面的语法不太正确)
sy5wg1nm3#
我遇到过与所选答案相同的场景,涉及具有表绑定的Azure函数。使用mock
CloudTable
有一些限制,特别是当使用System.Linq
和CreateQuery<T>
时,例如,这些是IQueryable
上的扩展方法。更好的方法是使用
HttpMessageHandler
mock,比如 * RichardSzalay.MockHttp * 和TableClientConfiguration.RestExecutorConfiguration.DelegatingHandler
,然后从表中删除您期望的json响应。字符串
cwdobuhd4#
下面是我的实现:
字符串
服务类实现:
型
mklgxw1f5#
假设您使用的是
Microsoft.WindowsAzure.Storage
命名空间中的类,使用NSubstitute创建模拟相对容易,例如:字符串
等等。