Как я делаю макет Системы. Сеть. Почтовый MailMessage?

Вам не нужно добавлять дополнительный CSS, поскольку Bootstrap3 его предоставляет. Если вы не хотите добавить его. Это мой код размещения логотипа слева и ссылки справа. Эта навигация отзывчива. Внесите изменения, как считаете нужным.

HTML:

<nav class="navbar navbar-expand-lg navbar-light fixed-top" style="background-color:white;">
        <div class="container">
        <a class="navbar-brand" href="#"><img style="   width: 150px;" src="image.jpg" alt="Image text"></a>
        <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarResponsive" aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation">
        <span class="navbar-toggler-icon"></span>
        </button>
            <div class="collapse navbar-collapse" id="navbarResponsive">
                <ul class="navbar-nav ml-auto">
                    <li class="nav-item"><a class="nav-link" href="#">Home</a></li>
                    <li class="nav-item"><a class="nav-link" href="#">Projects</a></li>
                    <li class="nav-item"><a class="nav-link" href="#">Blog</a></li>
                    <li class="nav-item"><a class="nav-link" href="#">Contact</a></li>
                </ul>
            </div>
        </div>
    </nav>
19
задан chobo2 30 June 2009 в 03:35
поделиться

4 ответа

Зачем имитировать MailMessage? SmtpClient получает сообщения MailMessages и отправляет их; это класс, который я хотел бы обернуть для целей тестирования. Итак, если вы пишете какой-то тип системы, которая размещает заказы, если вы пытаетесь проверить, что ваша служба OrderService всегда отправляет электронную почту при размещении заказа, у вас будет класс, подобный следующему:

class OrderService : IOrderSerivce 
{
    private IEmailService _mailer;
    public OrderService(IEmailService mailSvc) 
    {
        this. _mailer = mailSvc;
    }

    public void SubmitOrder(Order order) 
    {
        // other order-related code here

        System.Net.Mail.MailMessage confirmationEmail = ... // create the confirmation email
        _mailer.SendEmail(confirmationEmail);
    } 

}

Со значением по умолчанию реализация IEmailService, обертывающего SmtpClient:

Таким образом, когда вы идете писать свой модульный тест, вы тестируете поведение кода, который использует классы SmtpClient / EmailMessage, а не поведение самих классов SmtpClient / EmailMessage:

public Class When_an_order_is_placed
{
    [Setup]
    public void TestSetup() {
        Order o = CreateTestOrder();
        mockedEmailService = CreateTestEmailService(); // this is what you want to mock
        IOrderService orderService = CreateTestOrderService(mockedEmailService);
        orderService.SubmitOrder(o);
    } 

    [Test]
    public void A_confirmation_email_should_be_sent() {
        Assert.IsTrue(mockedEmailService.SentMailMessage != null);
    }


    [Test]
    public void The_email_should_go_to_the_customer() {
        Assert.IsTrue(mockedEmailService.SentMailMessage.To.Contains("test@hotmail.com"));
    }

}

Изменить: чтобы ответить на ваши комментарии ниже, вам понадобятся две отдельные реализации EmailService - только одна будет использовать SmtpClient, который вы будете использовать в коде своего приложения:

class EmailService : IEmailService {
    private SmtpClient client;

    public EmailService() {
        client = new SmtpClient();
        object settings = ConfigurationManager.AppSettings["SMTP"];
        // assign settings to SmtpClient, and set any other behavior you 
        // from SmtpClient in your application, such as ssl, host, credentials, 
        // delivery method, etc
    }

    public void SendEmail(MailMessage message) {
        client.Send(message);
    }

}

Ваша имитированная / фальшивая почтовая служба (для этого вам не нужна фиктивная структура, но она помогает) не будет касаться SmtpClient или SmtpSettings; он фиксировал только тот факт, что в какой-то момент ему было передано электронное письмо через SendEmail. Затем вы можете использовать это, чтобы проверить, был ли вызван SendEmail и с какими параметрами:

class MockEmailService : IEmailService {
    private EmailMessage sentMessage;;

    public SentMailMessage { get { return sentMessage; } }

    public void SendEmail(MailMessage message) {
        sentMessage = message;
    }

}

Фактическое тестирование того, было ли электронное письмо отправлено на SMTP-сервер и доставлено, должно выходить за рамки вашего модульного тестирования. Вам нужно знать, работает ли это, и вы можете настроить второй набор тестов для конкретной проверки (обычно называемые интеграционными тестами), но это отдельные тесты, отдельные от кода, который проверяет основное поведение вашего приложения.

t коснитесь SmtpClient или SmtpSettings; он фиксировал только тот факт, что в какой-то момент ему было передано электронное письмо через SendEmail. Затем вы можете использовать это, чтобы проверить, был ли вызван SendEmail и с какими параметрами:

class MockEmailService : IEmailService {
    private EmailMessage sentMessage;;

    public SentMailMessage { get { return sentMessage; } }

    public void SendEmail(MailMessage message) {
        sentMessage = message;
    }

}

Фактическое тестирование того, было ли электронное письмо отправлено на SMTP-сервер и доставлено, должно выходить за рамки вашего модульного тестирования. Вам нужно знать, работает ли это, и вы можете настроить второй набор тестов для конкретной проверки (обычно называемые интеграционными тестами), но это отдельные тесты, отдельные от кода, который проверяет основное поведение вашего приложения.

t коснитесь SmtpClient или SmtpSettings; он фиксировал только тот факт, что в какой-то момент ему было передано электронное письмо через SendEmail. Затем вы можете использовать это, чтобы проверить, был ли вызван SendEmail и с какими параметрами:

class MockEmailService : IEmailService {
    private EmailMessage sentMessage;;

    public SentMailMessage { get { return sentMessage; } }

    public void SendEmail(MailMessage message) {
        sentMessage = message;
    }

}

Фактическое тестирование того, было ли электронное письмо отправлено на SMTP-сервер и доставлено, должно выходить за рамки вашего модульного тестирования. Вам нужно знать, работает ли это, и вы можете настроить второй набор тестов для конкретной проверки (обычно называемые интеграционными тестами), но это отдельные тесты, отдельные от кода, который проверяет основное поведение вашего приложения.

class MockEmailService : IEmailService {
    private EmailMessage sentMessage;;

    public SentMailMessage { get { return sentMessage; } }

    public void SendEmail(MailMessage message) {
        sentMessage = message;
    }

}

Фактическое тестирование того, было ли электронное письмо отправлено на SMTP-сервер и доставлено, должно выходить за рамки вашего модульного тестирования. Вам нужно знать, работает ли это, и вы можете настроить второй набор тестов для конкретной проверки (обычно называемые интеграционными тестами), но это отдельные тесты, отдельные от кода, который проверяет основное поведение вашего приложения.

class MockEmailService : IEmailService {
    private EmailMessage sentMessage;;

    public SentMailMessage { get { return sentMessage; } }

    public void SendEmail(MailMessage message) {
        sentMessage = message;
    }

}

Фактическое тестирование того, было ли электронное письмо отправлено на SMTP-сервер и доставлено, должно выходить за рамки вашего модульного тестирования. Вам нужно знать, работает ли это, и вы можете настроить второй набор тестов для конкретной проверки (обычно называемые интеграционными тестами), но это отдельные тесты, отдельные от кода, который проверяет основное поведение вашего приложения.

32
ответ дан 30 November 2019 в 03:48
поделиться

Здесь вы будете издеваться над несколькими разными классами (как минимум двумя). Во-первых, вам нужна оболочка для класса MailMessage. Я бы создал интерфейс для оболочки, а затем он реализовал бы интерфейс. В вашем тесте вы создадите макет интерфейса. Во-вторых, вы предоставите фиктивную реализацию как ожидание фиктивного интерфейса для MailAddressCollection. Поскольку MailAddressCollection реализует Collection , это должно быть довольно просто. Если имитация MailAddressCollection проблематична из-за дополнительных свойств (я не проверял), вы можете сделать так, чтобы ваша оболочка вернула ее как IList , что как интерфейс должно быть легко имитировать.

public interface IMailMessageWrapper
{
    MailAddressCollection To { get; }
}

public class MailMessageWrapper
{
    private MailMessage Message { get; set; }

    public MailMessageWrapper( MailMessage message )
    {
        this.Message = message;
    }

    public MailAddressCollection To
    {
        get { return this.Message.To; }
    }
}

// RhinoMock syntax, sorry -- but I don't use Moq
public void MessageToTest()
{
     var message = MockRepository.GenerateMock<IMailMessageWrapper>()
     var to = MockRepository.GenerateMock<MailAddressCollection>();

     var expectedAddress = "test@example.com";

     message.Expect( m => m.To ).Return( to ).Repeat.Any();
     to.Expect( t => t.Add( expectedAddress ) );
     ...
}
1
ответ дан 30 November 2019 в 03:48
поделиться

In .NET 4.0 you can use the "duck-typing" to pass another class instead of "System.Net.Mail". Но в более ранней версии, боюсь, нет другого способа, кроме создания оболочки вокруг "System.Net.Mail" над фиктивным классом.

Если есть другой (лучший) способ, я бы хотел изучить его :) .

РЕДАКТИРОВАТЬ:

public interface IMailWrapper {
    /* members used from System.Net.Mail class */
}

public class MailWrapper {
    private System.Net.Mail original;
    public MailWrapper( System.Net.Mail original ) {
        this.original = original;
    }

    /* members used from System.Net.Mail class delegated to "original" */
}

public class MockMailWrapper {
   /* mocked members used from System.Net.Mail class */
}


void YourMethodUsingMail( IMailWrapper mail ) {
    /* do something */
}
0
ответ дан 30 November 2019 в 03:48
поделиться

Вы можете использовать $ ("# elementID"). height () == 0 поскольку вы знаете, что он будет либо вверх, либо вниз. Это может быть быстрее, чем выполнение .is (": visible"), но я не проводил никаких тестов по этому факту.

sqlservercentral.com/articles/T-SQL/66097/)[1240 visibleDocumentation

  • Создание диаграмм базы данных
  • Создание словаря данных

Нормализация и ссылочная целостность

  • Максимальное использование первичных ключей одного столбца насколько возможно. При необходимости используйте уникальные ограничения.
  • Ссылочная целостность будет всегда выполняться
  • Избегать ON DELETE CASCADE
  • OLTP должен быть не менее 4NF
  • Оценивать каждое отношение «один ко многим» как потенциальное «многие ко многим» связь
  • Первичные ключи, не созданные пользователем
  • Построение Модели на основе вставки вместо обновлений
  • От PK до FK должно быть то же имя (Employee.EmployeeId - это то же поле, что и EmployeeSalary.EmployeeId)
  • За исключением случаев, когда есть двойное соединение (Person.PersonId присоединяется к PersonRelation.PersonId_Parent и PersonRelation.PersonId_Child)

Обслуживание: Вместо того, чтобы найти какой-нибудь взлом, вы можете использовать Typemock Isolator, чтобы просто подделать этот класс только в одной строке кода:

var fakeMailMessage = Isolate.Fake.Instance<MailMessage>();

Затем вы можете настроить его поведение с помощью Isolate.WhenCalled

1
ответ дан 30 November 2019 в 03:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: