【发布时间】:2018-08-16 13:56:49
【问题描述】:
我有一个代码,我必须为其编写单元测试。 由于我是单元测试的新手,因此我正在寻求您的帮助。 我想测试 IsAdmin 方法,它将 CloudTableClient 和字符串作为输入,但我真的不知道如何处理它。 我尝试了下面的代码,但它失败并显示消息:
消息:测试方法 UnitTestMatan.UserControllerTests.IsAdmin_NotOnTheList_ReturnFalse 抛出异常: System.MethodAccessException:尝试通过方法'MatanWebServer.Controllers.UserController.IsAdmin(Microsoft.WindowsAzure.Storage.Table.CloudTableClient,System.String)'访问方法'Microsoft.WindowsAzure.Storage.Table.CloudTable.ExecuteQuery(Microsoft.WindowsAzure .Storage.Table.TableQuery, Microsoft.WindowsAzure.Storage.Table.TableRequestOptions, Microsoft.WindowsAzure.Storage.OperationContext)' 失败。
基本上,我要测试的第一件事是 IsAdmin 在收到不在表中或只是随机字符串的电子邮件时将返回 false。 在测试部分,我想使用在 UserController 中生成的表,而不是新建一个。
以下是我需要测试的类:
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Table;
using ParseMatanDataWebJob;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
namespace MatanWebServer.Controllers
{
public class UserController : ApiController
{
// GET: api/user
[AdminAuthorizeAttribute]
public IEnumerable<string> Get()
{
CloudStorageAccount storageAccount = CloudStorageAccount.Parse("DefaultEndpointsProtocol=http;AccountName=matandata;AccountKey=myconnectionstringthatidontwantyoutoknow");
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
IEnumerable<string> EmailsList = GetAllEmails(tableClient);
return (EmailsList);
}
// GET: api/user/5
[UserAuthorizeAttribute]
public ReturnObjectValuescontroller Get(string email)
{
// Retrieve the storage account from the connection string.p
CloudStorageAccount storageAccount = CloudStorageAccount.Parse("myconnectionstringthatidontwantyoutoknow");
// Create the table client.
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
var result = new ReturnObjectValuescontroller();
result.isAdmin = IsAdmin(tableClient, email);
// Create the CloudTable object that represents the "people" table.
CloudTable donationsTable = tableClient.GetTableReference("userdonationsdata");
// Create the table query.
TableQuery<DonationData> userDonationsQuery = new TableQuery<DonationData>().Where(
TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, email.ToString()));
var DonationsResult = donationsTable.ExecuteQuery(userDonationsQuery).ToList();
result.DonationsList = DonationsResult;
return result;
}
public static bool IsAdmin(CloudTableClient tableClient, string email)
{
CloudTable AdminsTable = tableClient.GetTableReference("matanadminusers");
TableQuery AdminsListQuery = new TableQuery();
AdminsListQuery.SelectColumns = new List<string>() { "AdminEmail" };
var TableEntityAdminsList = AdminsTable.ExecuteQuery(AdminsListQuery).ToList();
List<string> AdminsEmailList = new List<string>();
foreach (var item in TableEntityAdminsList)
{
AdminsEmailList.Add(item.Properties["AdminEmail"].StringValue);
}
return (AdminsEmailList.Contains(email, StringComparer.OrdinalIgnoreCase));
}
private IEnumerable<string> GetAllEmails(CloudTableClient tableClient)
{
CloudTable donationsTable = tableClient.GetTableReference("useremails");
TableQuery EmailsListQuery = new TableQuery();
EmailsListQuery.SelectColumns = new List<string>() { "RowKey" };
var DynamicEntityEmailsList = donationsTable.ExecuteQuery(EmailsListQuery).ToList();
List<string> EmailList = new List<string>();
foreach (var item in DynamicEntityEmailsList)
{
EmailList.Add(item.RowKey);
}
return EmailList.Distinct();
}
// POST: api/Rony
public void Post([FromBody]string value)
{
}
// PUT: api/Rony/5
public void Put(int id, [FromBody]string value)
{
}
// DELETE: api/Rony/5
public void Delete(int id)
{
}
}
}
这是我为 IsAdmin 尝试的测试:
using System;
using MatanWebServer.Controllers;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Table;
namespace UnitTestMatan
{
[TestClass]
public class UserControllerTests
{
[TestMethod]
public void IsAdmin_NotOnTheList_ReturnFalse()
{
var userController = new UserController();
CloudStorageAccount storageAccount = CloudStorageAccount.Parse("myconnectionstringthatidontwantyoutoknow");
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
var result = UserController.IsAdmin(tableClient, "str");
Assert.IsFalse(result);
}
}
}
【问题讨论】:
-
您可能想查看moq。
标签: c# visual-studio azure unit-testing azure-cloud-services