Может быть, это поможет вам.
package main
import (
"fmt"
"github.com/stretchr/testify/mock"
)
type userReader interface {
ReadUserInfo(int) int
}
type userWriter interface {
WriteUserInfo(int)
}
type UserRepository struct {
userReader
userWriter
}
type realRW struct{}
func (db *realRW) ReadUserInfo(i int) int {
return i
}
func (db *realRW) WriteUserInfo(i int) {
fmt.Printf("put %d to db.\n", i)
}
// this is mocked struct for test writer.
type MyMockedWriter struct {
mock.Mock
}
func (m *MyMockedWriter) ReadUserInfo(i int) int {
args := m.Called(i)
return args.Int(0)
}
func main() {
rw := &realRW{}
repo := UserRepository{
userReader: rw,
userWriter: rw,
}
fmt.Println("Userinfo is:", repo.ReadUserInfo(100))
repo.WriteUserInfo(100)
// when you want to write test.
fmt.Println("Begin test....................")
testObj := new(MyMockedWriter)
testObj.On("ReadUserInfo", 123).Return(250)
testRepo := UserRepository{
userReader: testObj,
userWriter: rw,
}
fmt.Println("Userinfo is:", testRepo.ReadUserInfo(123))
testRepo.WriteUserInfo(100)
}
// Output:
// Userinfo is: 100
// put 100 to db.
// Begin test....................
// Userinfo is: 250
// put 100 to db.
Удачи.
Взгляните на pexpect модуль. Это разработано для контакта с интерактивными программами, который, кажется, случай.
О, и помните, что пароль трудно кодирующего корня в оболочке или сценарии Python является потенциально дырой в системе безопасности :D
Используйте подпроцесс. Назовите Popen () для создания процесса, и использование связываются (), чтобы отправить ему текст. Извините, забыл включать КАНАЛ..
from subprocess import Popen, PIPE
proc = Popen(['server', 'stop'], stdin=PIPE)
proc.communicate('password')
Вы добились бы большего успеха, действительно избегают пароля и пробуют схему как sudo и sudoers. Pexpect, упомянутый в другом месте, не является частью стандартной библиотеки.
Это, кажется, работает лучше:
import popen2
(stdout, stdin) = popen2.popen2('server stop')
stdin.write("password")
Но это еще не 100%. Даже при том, что "пароль" является правильным паролем, я все еще получаю su: Извините назад из csh сценария, когда это пытается к su базироваться.
Должен смочь передать его в качестве параметра. что-то как:
commands.getoutput('server stop -p password')
import pexpect
child = pexpect.spawn('server stop')
child.expect_exact('Password:')
child.sendline('password')
print "Stopping the servers..."
index = child.expect_exact(['Server processes successfully stopped.', 'Server is not running...'], 60)
child.expect(pexpect.EOF)
Добился цели! Правила Pexpect!
Чтобы избежать необходимости отвечать на вопрос Пароля в сценарии Python, я просто собираюсь запустить скрипт как корень. Этот вопрос является все еще оставшимся без ответа, но я предполагаю, что просто сделаю это этот путь на данный момент.
Добавьте input =
в proc.communicate ()
, чтобы парни, которые любят использовать стандартную библиотеку lib.
from subprocess import Popen, PIPE
proc = Popen(['server', 'stop'], stdin=PIPE)
proc.communicate(input='password')